2013-11-12 2 views
8

У меня есть драгоценный камень Я работаю на локальном компьютере, который используется проектом.Локальный путь Джема для развития и удаленный Git Repo для производства

Если я указать местоположение драгоценного камня с помощью path в, я могу внести изменения и проект поднимает свежий код:

gem 'example', :path => "~/path/to/gems/example" 

Однако, когда я нажимаю на Heroku, отправка одной посылкой не удается, потому что Heroku может» t получить доступ к источнику драгоценных камней на моем локальном компьютере.

Так что я могу нажать на источник драгоценный камень на удаленный репозиторий и указать источник драгоценный камень там:

gem 'example', :github => 'example/example', :branch => 'example_feature' 

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

$ cd ~/path/to/gems/example 
$ git c -a -m "Update gem" 
$ git push origin example_feature 
$ cd ~/path/to/projects/project 
$ gem update example 

я могу сделать это немного менее болезненным путем установки локального переопределение моего местного репо:

$ bundle config local.example ~/path/to/gems/example 

Но мне все равно нужно добавлять измененные файлы в git, commit, а затем $ gem update example каждый раз, когда я меняю источник драгоценных камней, если мне нужны свежие изменения в моем проекте.

Есть ли способ, чтобы мой проект автоматически менял локальные изменения (как и при использовании path), но все же использовать удаленное репо в процессе производства?

+0

Я был застрял с этим несколько дней назад. 'bundle config local.gem/path/to/gem' - лучший способ, о котором я знаю. – dredozubov

ответ

4

Bundler перед тем v1.2

Via Gemfile,

group :development, :test do 
    gem 'example', :path => "~/path/to/gems/example" 
end 

group :production do 
    gem 'example', :github => 'example/example', :branch => 'example_feature' 
end 

... или использовать относительный путь к драгоценному камню и убедитесь, что Heroku увидеть камень в одном месте,

gem 'example', :path => "../../gems/example" 

... или, попробуйте сыграть с --deployment флагом в комплекте http://bundler.io/v1.3/deploying.html, он должен связывать ваши источники драгоценных камней с приложением, которое вы затем можете совершить на лету мерзавец ура приложения в так что в теории Heroku следует затем использовать локальную копию, а не использовать мерзавец для извлечения источников драгоценных камней (я говорю в теории, потому что Heroku имеет свои собственные причуды)

Bundler v1.2 и за ее пределы

http://bundler.io/v1.2/man/bundle-config.1.html#LOCAL-GIT-REPOS говорит

Bundler also allows you to work against a git repository locally instead of using the remote version. This can be achieved by setting up a local override:

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

For example, in order to use a local Rack repository, a developer could call:

bundle config local.rack ~/Work/git/rack

Now instead of checking out the remote git repository, the local override will be used. Similar to a path source, every time the local git repository change, changes will be automatically picked up by Bundler. This means a commit in the local git repo will update the revision in the Gemfile.lock to the local git repo revision. This requires the same attention as git submodules. Before pushing to the remote, you need to ensure the local override was pushed, otherwise you may point to a commit that only exists in your local machine.

Bundler does many checks to ensure a developer won't work with invalid references. Particularly, we force a developer to specify a branch in the Gemfile in order to use this feature. If the branch specified in the Gemfile and the current branch in the local git repository do not match, Bundler will abort. This ensures that a developer is always working against the correct branches, and prevents accidental locking to a different branch. Finally, Bundler also ensures that the current revision in the Gemfile.lock exists in the local git repository. By doing this, Bundler forces you to fetch the latest changes in the remotes.

+0

Не могли бы вы связаться с хорошим местом, чтобы узнать о некоторых из этих причуд? Я думаю, что я вижу, что Heroku нуждается в другом относительном пути для включения драгоценных камней, заданных с помощью ': path' в Gemfile. –

+1

Я получаю сообщение об ошибке: вы не можете указать тот же драгоценный камень, который дважды поступает из разных источников. Любые другие идеи по этому поводу? –

+0

@ RyanFrancis, это предупреждение нет? И да, это глупо, это новая версия bundler – bbozo

1

Как упоминаемый @bbozo, когда вы используете репозиторий в вашем Gemfile вы можете использовать bundle local overrides for development, который будет хранить ревизионные хэшей в вашем Gemfile.lock. При производстве эти точные хэши будут проверяться при запуске установки пакета.

Gemfile: gem 'example', git: 'https://github.com/your_name/example.git', branch: :master

Bundle команды конфигурации оболочки: bundle config local.example /path/to/local/git/repository

Gemfile.Блокировка (автогенерируемая): GIT remote: https://github.com/your_name/example.git revision: b9270e61abb89e1ff77fb8cfacb463e4d04388ad branch: master

Обратите внимание, что после того, как вы совершите в «примере» мерзавец репозиторий вам нужно будет запустить пакет установки на главном приложении, так что он перестраивает Gemfile.lock включить новую ревизию хэш , Я рекомендую использовать этот камень ниже, поскольку он автоматизирует этот процесс для вас, а также помогает в других сценариях. Смотрите страницу гем для точной детали:

https://github.com/EPI-USE-Labs/git-bundle

Смежные вопросы