0

仍然潜入开发我自己的 gem/engine 的有趣(但有点令人困惑)的世界。

我已成功将它部署到我的(私人)GitHub 帐户,但由于 gem 正在持续开发中,我不想一次又一次地部署它然后做bundle update等等,所以我找到了需要 gem 的选项指定这样的路径:

gem 'my_gem', path: 'path/to/my/gem'

这在开发时效果很好(它甚至似乎在rails s运行时从 gem 重新加载更改的文件[至少对于帮助者和视图来说它似乎这样做了,还没有使用控制器和模型,但希望他们会是这种情况, too],这对于在主机 Rails 应用程序中直接使用引擎的同时开发引擎非常有用)。

但是在部署到生产服务器时,我想从 github 获取 gem:

gem 'my_gem', git: "git@github.com:my_company/my_gem"

可悲的是,bundler 不允许多次需要 gem(即使它们在单独development/testproduction组中),所以我正在执行以下操作:

if File.directory?('../my_gem')
  gem 'my_gem', path: '../my_gem'
else
  gem 'my_gem', git: "git@github.com:my_company/my_gem.git"
end

到目前为止,这似乎工作得很好(虽然还没有使用 Capistrano 测试部署)。但它留下了一些问题:

1)这是解决我的问题的“正确”方法吗?似乎有点奇怪,我还没有找到更简单的方法,例如:

gem 'my_gem', path: '../my_gem', git: "git@github.com:my_company/my_gem.git"

...我希望捆绑程序首先简单地尝试该:path选项,如果它不可用,它会尝试该:git选项。但据我所知,这样做时,它只使用该:git选项。

2)开发这样的宝石是一种好习惯吗?我正在从我的主机应用程序中提取一些功能到一个引擎中,同时,我正在增强这个功能。所以我在我的主机应用程序中加载了引擎 gem,并从我的主机应用程序中更改引擎的代码(感谢上帝!)反映在我的主机应用程序中,而无需重新启动 rails 服务器。这感觉很“正确”,但由于在创建的引擎中有一个虚拟的 Rails 应用程序,我有点不确定我是否应该开发我的引擎与我的主机应用程序严格隔离,或者不。我认为这是一个哲学问题,但也许有人对此有意见并且可以发表利弊?

3) 我如何告诉 Capistrano 始终自动从 GitHub 将我自己的 gem 更新到最新版本?

4

1 回答 1

1

你可以做

if ENV['RAILS_ENV'] != "development"
  gem 'my_gem', git: "git@github.com:my_company/my_gem.git"
else
  gem 'my_gem', path: '../my_gem'
end

假设它RAILS_ENV被传递到bundle命令中(使用 capistrano 时也是如此)。

要将您的 gem 更新到最新版本,请尝试制作一个基本上执行此操作的 capistrano 任务

/path/to/bundler update my_gem

我真的无法评论你的其他观点。只是我的2美分。

于 2012-09-29T00:34:49.947 回答