执行

2013-05-26 16 views
2

我有一个标准的宝石的支架,并在bin目录内我有一个简单的可执行(bin/do_things.rb):执行

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

宝石尚未通过安装gem install,所以运行bin/do_things.rb没有bundle exec失败(我的Gemfilegemspec行)。

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

我可以创建一个包装器脚本来在Bundler下执行,但我宁愿利用rubygems-bundler。

或者我应该只输入bundle exec

+0

你能澄清你的脚本的目的吗?这是您仅在开发中使用的东西,还是您宝石的用户使用的东西?无论如何,我不建议直接在可执行文件中修改加载路径。 –

+0

安装时,gem可执行文件的目的是做一些shell实用程序的东西 - 在我的例子中移动一些文件。安装后用户可以访问它。 – Dan

回答

4

尝试:

bundle exec bash -l 

这将设置你到捆绑背景 - 它是如此运行exit将让你回到打捆少上下文中的额外的壳。

+0

谢谢!这正是我所期待的。对脚本不需要修改。这对我有效:'bundle exec zsh -l' – Dan

+0

另外,在OSX上,我必须取出第一个'bash'才能工作:'bundle exec bash -l' – Dan

+0

它是格式错误 - 现在应该修复 – mpapis

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) 
1

生成binstubs通过bundle install --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,这与创业板的可执行文件路径冲突,将在bin覆盖文件。

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

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