2

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

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

gem 尚未通过 安装gem install,因此运行bin/do_things.rb没有bundle exec失败(我Gemfilegemspec行中有行)。

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

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

还是我应该只输入bundle exec

4

3 回答 3

4

尝试:

bundle exec bash -l

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

于 2013-05-27T04:48:38.283 回答
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)
于 2013-05-26T19:56:26.863 回答
2

生成 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,这与 gem 的可执行路径冲突,并且会覆盖bin.

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

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

于 2013-05-26T20:27:24.030 回答