#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
после этого ответа не будет корректно создано для нескольких сред.