如何无需安装Rails Gem即可使用其生成器?
无需全局安装或修改Gemfile,就能运行Rails生成器的方案
嘿,我懂你的需求——不想折腾全局装Gem、也不想动项目的Gemfile,就能直接跑像rails g devise:install这类生成器对吧?其实这个是可以实现的,不过得先澄清个关键点:Rails生成器得加载对应Gem的代码才能工作,所以完全不把Gem弄到本地是做不到的,但我们可以临时加载Gem,完全不影响你的项目配置和全局Ruby环境,下面给你两个靠谱的方案:
方案1:用临时Gemfile配合bundle exec
这个方法最干净,不会留下多余的全局依赖:
- 先在项目根目录创建一个临时的Gemfile(比如叫
temp_gemfile.rb),内容就写你需要的Gem:
source 'https://rubygems.org' gem 'devise' # 换成你要用来跑生成器的Gem
- 然后用环境变量指定这个临时Gemfile,再用bundle exec跑生成器:
BUNDLE_GEMFILE=temp_gemfile.rb bundle exec rails g devise:install
bundle会自动把这个Gem(包括它的依赖)临时安装到本地的bundle缓存里,不会全局安装,也不会碰你项目原来的Gemfile。用完之后你直接删掉这个临时Gemfile就行,要是想彻底清理缓存,跑个bundle cache clean就好。
方案2:临时安装到指定目录,手动指定Gem路径
如果你不想用bundle,也可以直接临时装Gem到项目内的某个目录:
- 把Gem安装到项目里的临时目录,比如
./tmp_gems:
gem install devise --install-dir ./tmp_gems
- 然后设置
GEM_PATH让Rails能找到这个临时安装的Gem,再运行生成器:
GEM_PATH=./tmp_gems:$GEM_PATH rails g devise:install
这个方法同样不会全局安装Gem,用完删掉./tmp_gems目录就彻底清理干净了。
为啥gem fetch没用?
给你解释下:gem fetch只是把Gem的压缩包(.gem文件)下载到本地,根本没解压、没把它加到Ruby的加载路径里,Rails找不到生成器的代码,自然跑不起来——核心是得让Ruby能找到Gem的lib目录,这也是上面两个方案的关键。
补充小提示
如果你的生成器需要依赖其他Gem(比如devise会依赖bcrypt),上面的两种方法都会自动处理依赖:bundle会自动装依赖,gem install默认也会拉取所有依赖,所以不用担心缺组件的问题。
内容的提问来源于stack exchange,提问作者benjimix
相关产品推荐
相关产品推荐

