Как я могу указать местный драгоценный камень в моем Gemfile?

359

Я бы хотел, чтобы Bundler загрузил местный драгоценный камень. Есть ли вариант для этого? Или мне нужно переместить папку gem в каталог .bundle?

Picardo
источник

Ответы:

541

Я считаю, что вы можете сделать это:

gem "foo", path: "/path/to/foo"
Джимми Куадра
источник
10
Жестко закодированный путь подходит для быстрой сессии хакерства, но локальное решение gem от bloudermilk более эффективно для проектов под управлением версиями. Он позволяет вам проверять оба проекта - gem и project, используя gem - так, что другим не придется извлекать источник gem или использовать одни и те же пути.
mahemoff
4
Вы можете сделать это немного чище, используя символическую ссылку .gitignored на ваш локальный гем в каталоге вашего проекта - таким образом вы можете использовать управление исходным кодом для обоих проектов по отдельности, а другие могут делать то же самое, не имея идентичной структуры каталогов.
Дан
7
Что-то, на что стоит обратить внимание, может быть весна. Если вы используете локальный путь для своего драгоценного камня, вы можете заметить кэшированные версии вашего локального драгоценного камня, как я это делал в консоли rails. Если это не похоже на то, что ваши локальные изменения драгоценного камня подобраны, попробуйте spring stopпосмотреть, действительно ли это проблема.
Джейсон Р
1
По-видимому, добавление пути к локальному гему в config / spring.rb поможет получить изменения локального гема после перезапуска rails console / server.
Джейсон Р
5
Лучший способ сделать это здесь: rossta.net/blog/…
Cyzanfar
230

В дополнение к указанию пути (как упоминал Джимми), вы также можете заставить Bundler использовать локальный гем для вашей среды только с помощью следующей опции конфигурации:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Это очень полезно, если вы разрабатываете два драгоценных камня или приложение с гемами и рельсами параллельно.

Обратите внимание, что это работает только тогда, когда вы уже используете git для своей зависимости, например:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Как видно на документах .

bloudermilk
источник
У меня проблемы с этим, потому что я использую BUNDLE_PATH(сборка пакета для распространения). Делая то, что вы предложили, или ответ Джимми, он только делает using, и фактически не устанавливает в мою BUNDLE_PATHпапку. Я не смог понять это, какая-нибудь помощь?
Automatico
2
Обратите внимание, что это не будет работать с gemspec , согласно обсуждению здесь .
Даветаплей
31
Чтобы отключить локальное переопределение:bundle config --delete local.GEM_NAME
alxndr
Мне пришлось удалить директиву версии из строки гема, чтобы заставить это работать.
Epigene
4
Если вы хотите использовать ветку в разработке, отличную от производственной, вы также должны установить bundle config disable_local_branch_check trueили Bundler будет жаловаться на ветку. Однако будьте осторожны с этим, поскольку проверки должны предотвращать попадание неверных коммитов Gemfile.lock. Документы здесь: bundler.io/v1.12/git.html
Лев
33

Вы также можете ссылаться на локальный гем с помощью git, если вам довелось работать над ним.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Затем, если это изменится, я бегу

bundle exec gem uninstall foo
bundle update foo

Но я не уверен, что всем нужно выполнять эти два шага.

Rimian
источник
5
это замечательно, но не так удобно, если вы активно разрабатываете гем ... потому что вам нужно будет зафиксировать каждое изменение & bundle uninstall <gem> && bundle install , для каждого изменения, которое вы хотите отразить в своем приложении
Ramses
18

Чтобы использовать локальное хранилище гемов в проекте Rails, выполните следующие действия:

  1. Проверьте, является ли ваша папка gem хранилищем git (команда выполняется в папке gem)

    git rev-parse --is-inside-work-tree
  2. Получение пути к хранилищу (команда выполняется в папке gem)

    git rev-parse --show-toplevel
  3. Настройка локального переопределения для приложения rails

    bundle config local.GEM_NAME /path/to/local/git/repository

    где GEM_NAMEимя вашего драгоценного камня и /path/to/local/git/repositoryвывод команды в точке2

  4. В вашем приложении Gemfileдобавьте следующую строку:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. Бег bundle installдолжен дать что-то вроде этого:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    где GEM_NAMEимя вашего драгоценного камня и /path/to/local/git/repositoryиз точки2

  6. Наконец, запустите bundle list, а не gem listвы должны увидеть что-то вроде этого:

    GEM_NAME (0.0.1 5a68b88)

    где GEM_NAMEимя вашего драгоценного камня


Несколько важных случаев, которые я наблюдаю, используя:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Кажется RubyMine, не показывает локальные драгоценные камни в качестве внешней библиотеки. Более подробную информацию об ошибке можно найти здесь и здесь
  • Когда я изменяю что-то в локальном геме, для загрузки в приложение rails мне stop/startнужен сервер rails
  • Если я изменяю versionсамоцвет, stopping/startingсервер Rails выдает мне ошибку. Чтобы это исправить, я указываю версию gem в приложении rails Gemfileследующим образом:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
gotqn
источник
0

Вы можете ссылаться на драгоценные камни с источником: source: 'https://source.com', git repository (:github => 'git/url')и с локальным путем :path => '.../path/gem_name'.
Вы можете узнать больше о Gemfiles и о том, как использовать их в этой статье.

Неша Зорич
источник
-4

Если вы тоже хотите ветку:

gem 'foo', path: "point/to/your/path", branch: "branch-name"
С Джонсон
источник
Это не работает, Only gems with a git source can specify a branch.
выдает