【发布时间】:2012-09-26 08:53:19
【问题描述】:
仍在潜入开发我自己的 gem/引擎的有趣(但有点令人困惑)的世界。
我已经成功部署到我的(私人)GitHub账号了,但是由于gem在持续开发中,我不想一次又一次地部署它然后做bundle update等,所以我找到了通过指定这样的路径来要求 gem 的选项:
gem 'my_gem', path: 'path/to/my/gem'
这在开发时工作得很好(当rails s 正在运行时,它甚至似乎从 gem 重新加载更改的文件[至少对于助手和视图来说它似乎这样做了,还没有使用控制器和模型,但希望这个对他们来说也是如此],这对于在主机 Rails 应用程序中直接使用引擎的同时开发引擎非常有用)。
但是在部署到生产服务器时,我想从 github 获取 gem:
gem 'my_gem', git: "git@github.com:my_company/my_gem"
遗憾的是,bundler 不允许多次需要 gem(即使它们位于单独的 development/test 和 production 组中),所以我正在执行以下操作:
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"
...我希望 bundler 首先尝试 :path 选项,如果它不可用,则尝试 :git 选项。但据我所知,这样做时,它只使用:git 选项。
2) 像这样开发 gems 是一种好习惯吗?我正在从我的主机应用程序中提取一些功能到一个引擎中,同时,我正在增强这个功能。所以我在我的主机应用程序中加载了引擎 gem,并从我的主机应用程序中更改引擎的代码(感谢上帝!)反映在我的主机应用程序中,而无需重新启动 rails 服务器。这感觉很“正确”,但由于在创建的引擎中有一个虚拟的 Rails 应用程序,我有点不确定我是否应该开发我的引擎与我的主机应用程序严格隔离,或者不。我认为这是一个哲学问题,但也许有人对此有意见并可以发表利弊?
3) 我如何告诉 Capistrano 始终自动从 GitHub 将我自己的 gem 更新到最新版本?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3.1 gem bundler rails-engines