理解$PATH变量:已安装的gems不在路径中

4

早上好!

我正在开发一个Ruby宝石。目前为止,该宝石尚未被推送到任何服务器 - 目前仅为本地开发。

我想在构建宝石时进行测试(使用TTD)。我已经运行了bundle exe rake buildbundle exe rake install来在我的本地环境中构建和安装宝石。现在我期望当我在终端中输入gem_name时,gem_name应该被识别。不幸的是它没有被识别,而是出现了这个错误:

    `$ -bash gem_name: command not found`

我唯一能想到可能导致这个问题的原因是我的路径出了一些问题。
这是我的$PATH输出内容:
    echo $PATH
    /Users/throw/.rvm/gems/ruby-2.2.1/bin:
    /Users/throw/.rvm/gems/ruby-2.2.1@global/bin:
    /Users/throw/.rvm/rubies/ruby-2.2.1/bin:
    /usr/local:/usr/local/bin:
   /usr/local/sbin:/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:
   /usr/local/git/bin:/Users/throw/.rvm/bin:/Users/throw/.nvm/nvm.sh:
  /Users/throw/.node/bin:/Applications/Postgres.app/Contents/9.5.0.0/latest/bin

这里是gem env命令的输出结果:

    gem env
    RubyGems Environment:
      - RUBYGEMS VERSION: 2.5.1
      - RUBY VERSION: 2.2.1 (2015-02-26 patchlevel 85) [x86_64-darwin14]
      - INSTALLATION DIRECTORY: /Users/throw/.rvm/gems/ruby-2.2.1
      - USER INSTALLATION DIRECTORY: /Users/throw/.gem/ruby/2.2.0
      - RUBY EXECUTABLE: /Users/throw/.rvm/rubies/ruby-2.2.1/bin/ruby
      - EXECUTABLE DIRECTORY: /Users/throw/.rvm/gems/ruby-2.2.1/bin
      - SPEC CACHE DIRECTORY: /Users/throw/.gem/specs
      - SYSTEM CONFIGURATION DIRECTORY: /Users/throw/.rvm/rubies/ruby-2.2.1/etc
      - RUBYGEMS PLATFORMS:
        - ruby
        - x86_64-darwin-14
      - GEM PATHS:
         - /Users/throw/.rvm/gems/ruby-2.2.1
         - /Users/throw/.rvm/gems/ruby-2.2.1@global
      - GEM CONFIGURATION:
         - :update_sources => true
         - :verbose => true
         - :backtrace => false
         - :bulk_threshold => 1000
      - REMOTE SOURCES:
         - https://rubygems.org/
      - SHELL PATH:
         - /Users/throw/.rvm/gems/ruby-2.2.1/bin
         - /Users/throw/.rvm/gems/ruby-2.2.1@global/bin
         - /Users/throw/.rvm/rubies/ruby-2.2.1/bin
         - /usr/local
         - /usr/local/bin
         - /usr/local/sbin
         - /usr/bin
         - /usr/local/bin
         - /usr/bin
         - /bin
         - /usr/sbin
         - /sbin
         - /usr/local/git/bin
         - /Users/throw/.rvm/bin
         - /Users/throw/.nvm/nvm.sh
         - /Users/throw/.node/bin
         - /Applications/Postgres.app/Contents/9.5.0.0/latest/bin

目前为止,我认为gem_name路径已经包含在我的$PATH中,但我不确定...我是否遗漏了什么?

以下是gem_name.gemspec的内容:

    # coding: utf-8
    lib = File.expand_path('../lib', __FILE__)
    $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
    require 'instructortools/version'

    Gem::Specification.new do |spec|
      spec.name          = "instructortools"
      spec.version       = Instructortools::VERSION
      spec.authors       = ["Throw"]
      spec.email         = ["throw@gmail.com"]

      spec.summary       = %q{The command line interface instructor tools}
      spec.homepage      = "https://github.com/throw/instructortools-gem"
      spec.license       = "MIT"

      # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
      # delete this section to allow pushing this gem to any host.
      if spec.respond_to?(:metadata)
        spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
      else
        raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
      end

      spec.files         = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
      spec.bindir        = "exe"
      spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
      spec.require_paths = ["lib"]

      spec.add_development_dependency "bundler", "~> 1.11"
      spec.add_development_dependency "rake", "~> 10.0"
      spec.add_development_dependency "rspec", "~> 3.0"
      spec.add_development_dependency "pry"

      spec.add_runtime_dependency "thor"
    end

我有一个包含以下代码的exe目录:
    #!/usr/bin/env ruby

    require "instructortools"

    Instructortools::CLI.start(ARGV)

谢谢!


你的意思是这个 gem 包含一些可执行脚本,需要安装到路径中吗? - Vasfed
是的,@Vasfed。我已经编辑了我的问题以回答你的问题。 - UserAlice
git ls-files | grep -E '^exe' 显示了什么? - Vasfed
@Vasfed:当我运行那个命令时,没有输出。那个命令应该放在我的~/.bash_profile文件中吗? - UserAlice
1个回答

1

您应该在gemspec中提及您的可执行文件,方法如下:

spec.bindir "exe"
spec.executables ["your_script_name"]

所以,在安装rubygems时,它将其复制到/Users/throw/.rvm/gems/ruby-2.2.1/bin中,该路径在$PATH中。
编辑: 您的gemspec从git ls-files获取文件列表,因此在gem构建之前,所有文件都应该被提交以包含在gem中。

嗨@Vasfed!我编辑了我的问题,包括我的gemspec内容(其中包括spec.bindir“exe”spec.executables)。感谢您的帮助!非常感激 :) - UserAlice
@userthrow 看起来你还没有提交你的可执行文件,所以它不在 git ls-files 中,先提交然后构建 gem,可能会缺少一些文件。 - Vasfed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接