【问题标题】:How to install gem to local path and then require it如何将gem安装到本地路径然后需要它
【发布时间】:2016-06-26 15:30:15
【问题描述】:

我想将 ruby​​gems.org 中的 gem 设置到我的项目的某个子文件夹中,例如 "/gems",然后通过 require 从脚本中使用它。请帮我解决。

【问题讨论】:

  • 为什么要使用特定的子文件夹而不是默认的 gem 文件夹?
  • 我有一个小脚本,我想用 gems 分发它
  • 通常你会在 gem'.gemspec 中声明这样的依赖。为什么在您的情况下这是不可能的?
  • 你能给我一些使用gemspec文件的例子吗,我试试Gem::Specification.new do |s| s.require_paths = ['./gems'] 结束

标签: ruby rubygems


【解决方案1】:

首选方法是使用标准方案:根据gemspec,构建一个带有二进制文件的gem,将其打包,使用时它将自行下载所有依赖项。如果出于某种原因您无法接受上述内容,则可以选择以下选项之一:

• 您为您的脚本创建了一个gem

• 您指定path where to install dependencies

bundle install --path=vendor/gems

• 您在脚本中使用require_relative 而不是require,因为在目标计算机上不会有指向正确文件夹的本地捆绑配置文件;

• 脚本完成后,您将打包所有内容,包括 gem。

【讨论】:

    【解决方案2】:

    进入 ruby​​ 项目的常规方法是设置一个 Gemfile 并使用 bundler (see link for more info) 来处理您的项目所需的 gem,而不必考虑它们的存储位置

    但是,如果确实无法发送自己的 gem 目录,例如因为您的生产系统绝对无法访问互联网,所以您可以这样做:

    • 在项目的根目录中创建一个目录(例如“gems”)。
    • 下载并解压缩GEMS到该目录(或使用gem install将安装重定向到该目录中)
    • 在项目的根目录中使用以下常量创建一个 ruby​​ 文件:

      PROJECT_DIR = __dir__
      GEMS_DIR = File.join(PROJECT_DIR, 'gems')
      
    • 现在您可以索取您的宝石链接require File.join(GEMS_DIR, <gem_name>)

    尽管如此,如果可能的话,您应该考虑使用 bundler。

    编辑:通过gem install安装gem

    1. 从项目的gems目录中删除PG数据
    2. 卸载全局gem gem uninstall pg
    3. 再次安装 pg,但进入你的项目目录:gem install -i <path_to_projects_gems_dir> pg
    4. 使用指向上述 gem 的 require 再次运行脚本

    【讨论】:

    • oi64.tinypic.com/29zok0x.jpg - 我尝试过,但它对我不起作用.. 我有 /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in ` require': 无法加载此类文件 -- /home/ben/RubymineProjects/database_dumper/gems/pg-0.18.4.gem (LoadError)
    • 我正在尝试通过 gem unpack 解压 gem 并将路径设置为 ... lib/pg.rb.. 它不起作用
    • 你是如何将 gem 安装到目录中的?你拆开包装了吗?
    • 我只是下载 gem 文件并将其复制到 gems 文件夹中,他们我像这样解压缩 - “ gem unpack pg.gem”并尝试要求这个.. 我不明白为什么这不起作用.
    • gem install pg 在你的机器上工作吗? gem 包含 C 扩展,不仅是普通的 ruby​​,因此需要首先构建。意思是,简单地通过目录移植它并不容易。
    【解决方案3】:

    我是这样解决的:

    gem install -i ./pg

    ROOT = File.expand_path('..', __FILE__)
    ENV['GEM_PATH'] = File.join(ROOT, './')
    
    require 'pg'
    puts 'Version of libpg: ' + PG.library_version.to_s
    

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多