通过rubygems-bundler执行没有`bundle exec`

时间:2013-05-26 19:28:35

标签: ruby rubygems rvm bundler

我有一个标准的gem脚手架,在bin目录内我有一个简单的可执行文件(bin/do_things.rb):

#!/usr/bin/env ruby
require 'my_gem'
MyGem::doThings()

尚未通过gem install安装gem,因此在没有bin/do_things.rb的情况下运行bundle exec失败(我的Gemfile中有gemspec行。

有没有一种简单的方法让rubygems-bundler在bundler上下文中执行我的脚本?我应该只修改我的可执行文件中的$LOAD_PATH吗?

我也可以创建一个在Bundler下执行的包装脚本,但我宁愿以某种方式利用rubygems-bundler。

或者我应该只输入bundle exec

3 个答案:

答案 0 :(得分:4)

尝试:

bundle exec bash -l

它会将你设置为捆绑器上下文 - 它是一个额外的shell,因此运行exit将使你回到bundler更少的上下文。

答案 1 :(得分:2)

更改文件权限

chmod a+x bin/do_things.rb

并解析bin路径,忽略符号链接

require "pathname"
bin_file = Pathname.new(__FILE__).realpath

发布,将自己添加到libpath

$:.unshift File.expand_path("../../lib", bin_file)

答案 2 :(得分:2)

通过bundle install --binstubs生成binstubs会为我的gemspec中列出的所有可执行文件创建一个包装脚本。

#!/usr/bin/env ruby
#
# This file was generated by Bundler.
#
# The application 'do_things.rb' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require 'rubygems'
require 'bundler/setup'

load Gem.bin_path('my_gem', 'do_things.rb')

但是,默认情况下,binstubs路径为bin,与gem的可执行路径冲突,并将覆盖bin中的文件。

运行bundle install --binstubs=SOME_DIR然后将SOME_DIR添加到.gitignore似乎是最易于维护的方式。

然后,我可以简单地执行SOME_DIR/do_things或我添加的任何其他项目特定的可执行文件。