Pytanie Dlaczego bundler używa więcej niż jednej lokalizacji klejnotu?


Tak się dzieje w Lalki pakiet.

The Gemfile  określa

gem "puppet", :path => File.dirname(__FILE__), :require => false

Ale jeden z klejnotów, w których zainstalowałem $GEM_HOME pojawia się w $: po wszystkim.

$ bundle exec ruby -e 'puts $:'
...
/home/puppy/puppet-git-clone/lib
...
/usr/lib/ruby/vendor_ruby
...
/home/puppy/gems/gems/puppet-3.7.5/lib
...

Nie stanowi to problemu sam w sobie, ale najwyraźniej Ruby załaduje Puppet 3.7.5 zamiast tego 3.7.3 Sprawdziłem z repozytorium git.

$ bundle exec irb
irb(main):001:0> require 'puppet'
=> true
irb(main):002:0> Facter.value(:puppetversion)
=> "3.7.5"

Dlaczego marionetka nie jest załadowana z drzewa git i jak mogę ją dalej debugować?

Aktualizacja

Lalki .gemspec może być zaangażowany. Jego sprytny o określeniu wersji. Teraz martwię się, że Rubygems faktycznie ładuje zainstalowany 3.7.5 klejnot tak Puppet.version Prawdę mówiąc zgłosię niewłaściwą wartość, wyrzucając bundler. Czy to możliwe, co się dzieje?

Zaktualizuj 2

Jak zasugerowano w komentarzach, próbowałem statycznie ustawić ścieżkę i wersję w Gemfile.

gem "puppet", "3.4.2", :path => "/home/puppy/puppet-git-clone", :require => false

Co do wyniku, cóż - przynajmniej bundler jest konsekwentny w swoich poglądach ;-)

Could not find gem 'puppet (= 3.4.2) ruby' in source at /home/ffrank/git/puppet.
Source contains 'puppet' at: 3.7.3
Run `bundle install` to install missing gems.

11
2018-04-17 20:53


pochodzenie


Jakiej wersji programu bundler używasz? To brzmi jak znany problem z bundlerami o 2 oznaczonych tagami wydaniach temu. - Chase Gilliam
@ChaseGilliam Mogę się rozmnażać z bundlerami 1.7.4 i 1.9.4, Niestety. - Felix Frank
Spróbuj nadać mu absolutną ścieżkę, taką jak klejnot "lalek",: ścieżka => "/ dom / szczeniak / lalka-git-klon" - Chase Gilliam
@ChaseGilliam taki sam efekt. Zaczęłam go używać bundle update --verbose i zaktualizuje pytanie z niewielkim odkryciem. - Felix Frank
Zgłaszanie wersji w ten sposób jest dość typowe, wątpię, że to jest problem. Może spróbuj podać wersję w gemfile. - Chase Gilliam


Odpowiedzi:


Szybka korekta polega na dodaniu -Ilib do polecenia ruby:

$ bundle exec ruby -e "require 'puppet'; puts Facter.value(:puppetversion)"
3.7.5

$ bundle exec ruby -Ilib -e "require 'puppet'; puts Facter.value(:puppetversion)"
3.7.3

Jeśli porównamy ścieżki ładowania, zobaczysz, że dodawanie -Ilib wyniki w 3.7.5 nie są obecne na drugiej ścieżce obciążenia:

$ diff <(bundle exec ruby -e 'puts $:') <(bundle exec ruby -Ilib -e 'puts $:') | grep 'puppet-'
< /Library/Ruby/Gems/2.0.0/gems/puppet-3.7.5/lib

Wygląda na to, że powinno to być zachowanie domyślne, więc może pojawić się błąd w pakiecie bundler.


4
2018-05-01 03:07



Podoba mi się prostota tego. Kiedy nie dzwonić ruby bezpośrednio, to też to zrobi: RUBYLIB=lib bundle exec puppet agent --version. - Ale wtedy to obejście wydaje się zbędne. Biorę to, jeśli nie działa żadna inna odpowiedź. - Felix Frank


Pod warunkiem, że usunąłeś swój Gemfile.lock i usunąłem wszystkie inne wersje klejnotu przed próbą bundle exec ... chociaż nie jest to jednoznacznie zdefiniowane przez ten sam problem, jest to znany problem Bundler Sprawdź to:

I należy to naprawić na podstawie tego połączonego żądania Pull:

To spowoduje, że twoje "preferowane źródło" będzie faworyzowane i użyte.

(Łącza używane jako odpowiedź, ponieważ odnosi się do istniejących działań, a nie rozwiązanie, które można umieścić tutaj w odpowiedzi.Nie odpowiedź link-only.)


1
2018-04-27 08:09



Dobry telefon, mam podejrzenie, że hiera klejnot, który zależy od puppet klejnot jest w jakiś sposób zaangażowany. Jednak zastosowanie tej poprawki do bundler 1.9.4 nie rozwiązuje problemu. Usuwanie Gemfile.lock jest nieskuteczne. The 3.7 klejnot był nie oddalony. Cały ten problem nie istnieje, jeśli nie zainstalowano żadnego klejnotu z inną wersją. - Felix Frank
Przykro mi słyszeć, że ta odpowiedź nie jest tą. Wysłałem kolejną myśl, o której myślałem, mając podobne problemy. - digitalextremist


Spróbuj tego :

source "file://home/puppy/puppet-git-clone"

gem "puppet", "3.4.2", :path => "/home/puppy/puppet-git-clone"

dlaczego potrzebujesz fałszu?


1
2018-04-28 07:29



The :require jest z góry. Usunięcie go nie ma wpływu na wynik. - Felix Frank


Po tym, co powiedziałeś w poprzedniej odpowiedzi, spróbuj tego:

Dodaj gemspec dla Twojej Gemfile blisko szczytu.

Jeśli to zrobisz, kolejne gem ... połączenia będą nadpisywać gemspec który ostatecznie ustawia wersję.

Dodaj to tutaj:

source ENV['GEM_SOURCE'] || "https://rubygems.org"
gemspec # and let me know if this fixes it

1
2018-04-29 21:06



Ciekawy. Wciąż zepsuty, ale teraz otrzymuję to ostrzeżenie: lib/puppet/version.rb:10: warning: already initialized constant PUPPETVERSION, z pliku w repozytorium git. - Felix Frank
Dziękuję za wszystkie wysiłki, ale ponieważ nie było rezolucji, nie mogę przyznać ci pucharu w uczciwości. Więcej szczęścia następnym razem! - Felix Frank


Jak ostatnio powiedziałem, znalazłem ten sam problem, który miałeś w moich własnych projektach. I rozwiązałem to przez obejście. Sam pomysł jest tym, co tu daję, nie twierdzę, że jest to najbardziej efektywny lub wolny od błędów sposób. Różniło się z tym podejściem.

Obejmuje porwanie Gemfile i może gemspec, w zależności od tego, co jest sprawcą w rzeczywistości - ta część jest wciąż nieznana. Moja ostatnia odpowiedź, drugie podejście, które podałem, może rozwiązać już teraz. Jeśli nie, możesz potrzebować obejścia. Istnieje wiele impasów stojących dla Bundlera.


W trakcie pracy wstaw kustosza.

Sugeruję, pod koniec Gemfile wstawiasz procesor, taki jak ten, do kuratora Bundler::Dsl siebie. Możemy skupić się całkowicie na klejnocie, który chcesz rozwiązać, ale można to zrobić dla wszystkich klejnotów.

Na przykład ... jest to głównie koncepcja, może działać, ale może mieć błąd. Będziesz musiał go stwardnieć. Spowoduje to usunięcie wszystkiego poza wersją, której oczekujesz:

PUPPET_VERSION = 'version desired'
until(current = self.dependencies.find { |d| d.name == 'puppet' }) == 1
    current.each { |gem|
        if !gem.version == PUPPET_VERSION
            self.dependencies.delete(current)
        end
    }
end

Nie jestem pewien, której wersji faktycznie chcesz. Wspomniane są trzy wersje, 3.7.3, 3.7.5 ... po prostu podłącz tę, którą chcesz. Wszelkie inne wersje zostaną usunięte z zależności Bundler pracuje z.


1
2018-04-30 09:16



Undefined local variable or method 'dsl' for Gemfile - Felix Frank
Zaktualizowano to. Tak naprawdę jest self nie dsl. Przepraszam za to. Jest to przykład Bundler::Dsl - digitalextremist
Daje błąd. Z --verbose to mówi Gemfile:85:in 'eval_gemfile': undefined method 'each' for #<Bundler::Dependency:0x00000001b594f0> (NoMethodError) od $HOME/gems/gems/bundler-1.9.4/lib/bundler/dsl.rb:32:in 'instance_eval' - Felix Frank


Miałem ten sam problem w przeszłości, myślę, że możesz określić swój klejnot bez parametru "require: false" i będzie szukał konkretnej wersji Gemfile.

gem "puppet", "3.4.2", :path => "/home/puppy/puppet-git-clone"

Jeśli określisz opcję "wymagaj" za pomocą "gem" i uruchom komendę "irb" przy pomocy bundle exec irb zawsze ładuje najnowszą wersję dla klejnotów, które zadeklarowało require: false opcja.


1



Jest to w zasadzie odpowiedź od WebQube. Robienie tego w ogóle nie pomaga. bundler nalega na to Source contains 'puppet' at: 3.7.3 - Felix Frank