Gem 同时开发多个 gem 时的 best practice ?

AReverie · 2013年11月19日 · 最后由 anklos 回复于 2013年11月19日 · 2797 次阅读

update:

刚刚发现 :path 的方法还是有问题,bundler 依旧会把 path 的代码复制到 vendor/cache/xxx 下运行,即修改了 原来 :path 的代码不生效,每次需要重新 bundle install 一下

看来要做到这个要求,需要 hack 一下 bundler 了


不知道适合不适合发这个结点...

有以下情景,开发的一个 gem 依赖另外一个自己写的 gem,但两者需要同时写代码和 debug。

python 使用 setuptools 的话可以用 python setup.py develop 相当于到 syspath 的 site-packages 里做了一个 symlink 到源代码目录

不知道 bundler 是否有支持这种用法?

某现在的做法,gem1 的 Gemfile 里写

gem 'gem2', :git => 'git url'

bundle install 后 gem2 的源代码会在 vendor/cache/gem2 里,不过要修改源代码就得到这个目录里去了

比较希望两个 gem 源代码 都在习惯放源代码的位置(比如某个人习惯放 ~/src/ruby/ 下)

有这类 best practice 吗?

Thanks.

两 Gemfile 放同一目录下

# gem1 Gemfile
gem 'gem2', :path => '../gem2'
# gem2 Gemfile
gem 'gem1', :path => '../gem1'

gem 修改后直接运行就可以了,不用 bundle

不知道是否理解对了楼主的意思。。

其实完全不必用 bundler 的。 在一个 gem 代码的一开始直接把另一个 gem 的 lib 目录加载到 loadpath 同时将同名文件 require 进来就可以了,做得事情和 require 一个 gem 的事情是一样的。

#3 楼 @iBachue 那这种情况下如何保证用到其他地方去的时候不需要改源代码?一般来说其他地方用这个 gem 都需要 bundler Gemfile 吧

#4 楼 @AReverie 如果你被调用的 gem 方法名称和返回不变的话 开发时 gem1 里面就写成 path:本地目录 等发布的时候改成 gem2 的正式地址 这样你的 gem2 可以一直在改 只要文档一致就行

#5 楼 @zj0713001 嗯,刚刚换成 :path 的方法,可以直接利用指定目录的源代码,唯一的缺点就是 提交回去时要记得把 Gemfile 改回去。

#6 楼 @AReverie 在 Gemfile 里加上 if RAILS_ENV='development' or 'test' use :path, else use 'git url'

#7 楼 @anklos :D 是一种解决办法,但是哪里去设置这个变量呢?rails app 的 bundle 运行时这个 变量已经设置了?另外就是基本不用 Rails 呢。

#3 楼 @iBachue 好吧,某觉得这种做法可能是对的,不过问题是两个是分开的 gem 如何解决 后续的 $LOAD_PATH 问题呢

#9 楼 @AReverie 等到你开发到可以 build 的时候这种方法自然就失效了啊。

#4 楼 @AReverie 你还在开发期间不要过早的考虑别人怎么用嘛。 等到有 build 之后就采用最傻的改一次代码 rake build && rake install 的办法吧。

#6 楼 @AReverie 可以让 git assume 这个文件没改过的

#7 楼 @anklos 这个方法真的是 Rails only 的诶。。

同时开发本身就不是 best practice 了吧,gem 对外公布的 api 就是要稳定的。写下游 gem 的时候想,哎呀这个在上游改一下接口就行了,那么其他使用这个 gem 的人怎么办?

#8 楼 @AReverie 不用 rails 就自定义个环境变量,export GEM1_ENV='development'在你的 bashrc 的文件里。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号