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


359

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

Ответы:


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

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


У меня проблемы с этим, потому что я использую 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

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


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'


-4

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

gem 'foo', path: "point/to/your/path", branch: "branch-name"

Это не работает, Only gems with a git source can specify a branch.
выдает
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.