如果我有本地 gem (gemfile.gem),如何在不安裝 gem 的情況下從代碼或命令列獲取名稱和版本資訊。
原因:我正在安裝一個用戶 gem 來驗證它并想卸載它來清理它。用戶 gem 不是我控制的東西,所以我不能依賴命名約定。
命令列解決方案:
gem spec gemfile.gem name
gem spec gemfile.gem version
紅寶石解決方案:
name = Psych.safe_load(`gem spec gemfile.gem name`).to_s
version = Psych.safe_load(`gem spec gemfile.gem version`, permitted_classes: [Gem::Version]).to_s
# Now you can uninstall the gem with
Gem::Uninstaller.new(name, {:version => version, :force => true}).uninstall
uj5u.com熱心網友回復:
您可以在中查看鎖定版本Gemfile.lock
cat Gemfile.lock | grep gem-name
其他選項,但需要bundle install先
bundle exec gem dependency | grep gem-name
更新:
如果您需要檢查本地 gem 版本,例如some-gem.gem,您可以使用該命令從二進制檔案中決議所有資訊
gem specification some-gem.gem
要不就
gem spec some-gem.gem
也可以用 Ruby 格式查看
gem spec some-gem.gem --ruby
當然你可以用wordgrep過濾行version
但最好將它作為這樣的引數傳遞
gem spec some-gem.gem version
uj5u.com熱心網友回復:
你的問題模棱兩可。如果您的意思是“我如何從 gemspec 中讀取 gem 名稱和版本?” 那么你可以使用Gem::Specification#load的輸出。例如,假設你有一個標準布局的 gem,并且foo_bar.gemspec在你的 gem 專案目錄的根目錄中,你可以使用 Git 找到你的專案的頂層并在 gemspec 中讀取:
$ cd "$(git rev-parse --show-toplevel)
$ ruby -e 'puts Gem::Specification.load "#{File.basename Dir.pwd}.gemspec"'
#<Gem::Specification name=foo_bar version=0.1.0>
然后,您可以使用 sed、awk 或 cut 決議輸出。
uj5u.com熱心網友回復:
AGemfile沒有(必然)指定依賴項的確切版本。它可能沒有指定任何內容(即“任何版本都可以”),或~> 1.0(即>= 1.0和< 2.0),或其他任何內容。此外,依賴約束可能會進一步限制版本的有效范圍。
我假設這不是你的問題的意思。相反,您想知道通過運行將安裝哪些確切版本bundle install的依賴項,給定一個Gemfile.lock.
可靠地實作這一點的一種方法(即,而不是使用grep和觀察哪些行是最相關的)是通過決議Gemfile.lock:
require 'bundler'
lockfile = Bundler::LockfileParser.new(Bundler.read_file('Gemfile.lock'))
puts lockfile.specs.find { |spec| spec.name == 'the-gem-you-want-to-check' }.version
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489094.html
上一篇:如何糾正Ruby倒數計時器?
