Дважды указать один и тот же драгоценный камень для разработки / тестирования и производства, но разными путями

#ruby-on-rails #ruby #git #github

#ruby-on-rails #ruby #git #github

Вопрос:

Иногда вы создаете gem, специфичный для проекта. Это помогает абстрагироваться и перенести часть «ответственности» из основного приложения Rails в более модульное место.

Драгоценный камень будет расположен здесь, в вашем приложении:

 gem 'example_gem', path: './example_gem'
  

Вы объединяете, и все в порядке. Теперь вы git init создаете драгоценный камень и сохраняете его в собственном репозитории на github. Вы пытаетесь сделать это, чтобы поддерживать удобство для разработчиков:

 group :development, :test do
  gem 'example_gem', path: './example_gem'
end

group :production do
  gem 'example_gem', github: 'company/example_gem'
end
  

Вы похлопываете себя по спине за увеличение рабочего процесса, но после запуска bundle вы получаете:

 Your Gemfile lists the gem example_gem (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of just one of them later.
You cannot specify the same gem twice coming from different sources.
You specified that example_gem (>= 0) should come from source at ./example_gem and git://github.com/company/example_gem.git
  

Рабочий процесс здесь заключается в том, чтобы иметь возможность редактировать gem в процессе разработки, а когда вы закончите, зафиксируйте эти изменения и отправьте их на Github. НО, когда вы разрабатываете, вы не хотите выполнять git commit, git push и обновление пакета в вашем основном приложении только для того, чтобы увидеть небольшое изменение.

Кто-нибудь знает лучший способ решить эту проблему?

Комментарии:

1. почему вы не можете получить доступ к github в средах разработки и тестирования?

2. example_gem — это внешняя зависимость текущего проекта. Ваши изменения в текущем проекте должны быть независимыми от example_gem

3. Я не думаю, что вы понимаете, что здесь происходит @kikicarbonell. Если вам нужно внести изменения в gem и вы хотите увидеть изменения, отраженные в приложении, вы должны зафиксировать, нажать, а затем обновить пакет, чтобы увидеть эти изменения. Чтобы обойти это, у вас есть path . Проблема возникает, когда вам нужно зафиксировать код. Если у вас есть example_gem в вашем .gitignore , ваше приложение завершит работу в процессе производства. Переключение пути и github туда и обратно становится проблемой…

4. Также @kikicarbonell можете ли вы обновить грамматику? Я не уверен, какие вопросы вы задаете.

5. В этом контексте example_gem — это просто абстрагированный код из вашего проекта. Таким образом, example_gem на самом деле не является «внешней зависимостью», но, тем не менее, является зависимостью.

Ответ №1:

Да, есть способ получше: во-первых, используйте gem в качестве git gem во всех средах

 gem :example_gem, :git => 'git@github.com:foo/example_gem', :branch => :master #you need to set a branch
  

Затем в папке вашего приложения запустите

 bundle config --local local.example_gem /path/to/gem
  

Это отредактирует файл .bundle / config, чтобы установить этот параметр (убедитесь, что этот файл не проверен в системе управления версиями!) и попросит bundler получить драгоценный камень по этому пути.

В тот момент, когда вы собираетесь отправлять свои коммиты, вы должны быть немного осторожны: если ваше приложение зависит от еще не зафиксированных изменений в драгоценном камне, тогда, очевидно, все сломается. Кроме того, при передаче в репозиторий примера драгоценного камня Gemfile приложения rails.блокировка будет обновлена. Если вы нажимаете Gemfile.блокировка, ссылающаяся на коммит, который существует только в вашей копии репозитория example_gem, тогда другие пользователи будут заблокированы.

Комментарии:

1. Важно отметить, что это работает только для драгоценных камней, которые используются :git в Gemfile и где ветвь одинакова в Gemfile и локальном пути. Смотрите github.com/bundler/bundler/issues/3645

Ответ №2:

у меня это работает.

 foo = "https://github.com/me/my-development-version-gem.git"
group :production do
    foo = "https://github.com/me/my-production-version-gem.git"
end
gem "foo", :git => foo
  

в моем случае мне нужны разные ветви для envs для engine

Комментарии:

1. Внимание: Это не сработает, если вы не запустите bundler повторно в производственной системе. Gemfile.lock после этого ответа не будет корректно создано для нескольких сред.