13

我有一个正在本地开发的 gem,项目正在使用它。

如果我在 中指定 gem 的位置path,我可以进行更改,项目将获取新代码:

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

但是,当我推送到 Heroku 时,捆绑失败,因为 Heroku 无法访问我本地计算机上的 gem 源。

所以我可以将 gem 源推送到远程仓库并将 gem 源指向那里:

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

但是,我现在需要将更改推送到此存储库,然后更新 gem 以获取项目中的新更改:

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

我可以通过为我的本地 repo 设置本地覆盖来减轻痛苦:

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

但是我仍然需要将更改的文件添加到 git,提交,然后$ gem update example每次更改 gem 源时,如果我想在我的项目中进行新的更改。

有什么方法可以让我的项目自动获取本地更改(就像我使用 时那样path),但仍然在生产中使用远程仓库?

4

3 回答 3

8

v1.2 之前的捆绑器

通过 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

...或者,使用 gem 的相对路径并确保 Heroku 在同一位置看到 gem,

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

...或者,尝试在捆绑器http://bundler.io/v1.3/deploying.html--deployment中使用标志,它应该将您的 gem 源与应用程序捆绑在一起,然后您可以将其提交到应用程序的 git,所以理论上 Heroku 应该然后使用本地副本而不是使用 git 来获取 gem 源(我说理论上是因为 Heroku 有自己的怪癖)

Bundler v1.2 及更高版本

http://bundler.io/v1.2/man/bundle-config.1.html#LOCAL-GIT-REPOS

Bundler 还允许您在本地处理 git 存储库,而不是使用远程版本。这可以通过设置本地覆盖来实现:

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

例如,为了使用本地 Rack 存储库,开发人员可以调用:

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

现在不再检出远程 git 存储库,而是使用本地覆盖。类似于路径源,每次本地 git 存储库更改时,Bundler 都会自动拾取更改。这意味着本地 git repo 中的提交会将 Gemfile.lock 中的修订更新为本地 git repo 修订。这需要与 git 子模块一样的注意。在推送到远程之前,您需要确保已推送本地覆盖,否则您可能指向仅存在于本地计算机中的提交。

Bundler 会进行许多检查以确保开发人员不会使用无效的引用。特别是,我们强制开发人员在 Gemfile 中指定一个分支以使用此功能。如果 Gemfile 中指定的分支与本地 git 存储库中的当前分支不匹配,Bundler 将中止。这可确保开发人员始终针对正确的分支工作,并防止意外锁定到不同的分支。最后,Bundler 还确保 Gemfile.lock 中的当前版本存在于本地 git 存储库中。通过这样做,Bundler 会强制您获取遥控器中的最新更改。

于 2013-11-13T15:11:26.457 回答
1

我在互联网上找到的最佳解决方案 https://rossta.net/blog/how-to-specify-local-ruby-gems-in-your-gemfile.html

捆绑配置 local.tacokit /path/to/tacokit

在 Gemfile 中使用 gem "tacokit", github: "rossta/tacokit", branch: "master"

这东西正在工作并经过测试的解决方案

于 2017-01-30T10:24:45.037 回答
1

正如@bbozo 所提到的,当您在gemfile 中使用git 存储库时,您可以使用捆绑本地覆盖进行开发,它将修订哈希存储在您的Gemfile.lock 中。在生产中,这些确切的修订哈希将在运行 bundle install 时被检出。

宝石文件: gem 'example', git: 'https://github.com/your_name/example.git', branch: :master

捆绑配置 shell 命令: bundle config local.example /path/to/local/git/repository

Gemfile.lock(自动生成): GIT remote: https://github.com/your_name/example.git revision: b9270e61abb89e1ff77fb8cfacb463e4d04388ad branch: master

请注意,在“示例” git 存储库中提交后,您需要在主应用程序上运行 bundle install ,以便它重建 Gemfile.lock 以包含新的修订哈希。我建议使用下面的 gem,因为它可以为您自动执行此过程,并且还有助于其他情况。有关详细信息,请参阅 gem 页面:

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

于 2016-07-01T16:17:43.817 回答