Ruby gem相当于" pip install -e"?

时间:2014-11-11 22:42:42

标签: ruby gem

在Python中,我可以使用pip install -e"editable" mode中安装源代码包。然后我可以继续编辑代码,任何更改都将由import library

的其他Python脚本自动选择

是否有类似的工作流程来开发Ruby宝石?什么是" Ruby方式"在开发时使用libs而不是每次我对源进行更改时编译和安装gem?

4 个答案:

答案 0 :(得分:9)

bundler可能会使用两种常用方法:

  1. 一个人执行bundle install --path vendor/bundle不会运行bundle update,除非所有内容都经过测试
  2. 一个告诉捆绑商使用本地版本的gem:
      Gemfile
    • (由于rubygems维护问题,mymaingem.gemspec不支持此项):gem 'mycutegem', :git => 'git://github.com/myname/mycutegem', :branch => 'master';
    • 在命令行中:bundle config local.mycutegem /path_to_local_git/mycutegem
  3. 第一种方法是将所有内容下载到当前项目的子文件夹中(这里它是vendor/bundle。)随意修改那里的所有内容,它将被反映出来。

    第二种方法可能更好。您将从github克隆gem并指示bundle使用相应git存储库的本地克隆。此方法使您能够将对主gem的更改发布到存储库中。一旦发布了依赖回购,最新版本将由您的宝石订阅者检索,假设他们没有指示他们的bundler使用他们的当地人。

    希望这有帮助。

答案 1 :(得分:5)

假设您的宝石代码位于文件夹中(例如my_project/mygem/lib)。您可以使用my_project代码在mygem中添加一些Ruby代码。

我要做的是将mygem/lib添加到所述文件开头的$LOAD_PATH全局变量中。有点像这样:

$LOAD_PATH << File.expand_path('lib', './mygem') # Resolve global paths

require 'a_file' # Would require "mygem/lib/a_file.rb"

答案 2 :(得分:2)

我不确定这是否正是您想要实现的目标,但是从描述中我推断出您希望拥有某个gem的本地副本并在项目中引用该gem。 如果是这种情况,您可以(通常)分两步完成:

  1. 从VCS克隆宝石(在大多数情况下:git),例如: git clone url-of-the-gem-repo
  2. 使用Bundler:path引用本地副本,例如 gem "some-gem", :path => "/path/to/local/copy"
  3. 如果gem存储在github中,更好的方法是先在github上分叉,然后克隆自己的副本。然后,如果您对本地仓库中的代码进行任何改进,您可以使用拉取请求轻松地与全世界共享。

答案 3 :(得分:0)

我意识到这是一个5岁的问题,但是我发现所有这些答案都不令人满意。由于我使用ruby开发CLI工具,因此使用捆绑程序进行测试不是理想的选择。我需要能够在任何地方执行我的测试命令,并获得与pip install --editable实际相等的值。

这是我的解决方法。

  1. 使用RVM设置新的宝石集进行开发

    rvm gemset use tools-dev --create

  2. 安装宝石

    gem install mygem.gem

  3. 找到安装目录

    gem list tool -d

  4. 在输出中将显示installed at ${rvm_gemset_path}。复制该路径。它还将是一个环境变量GEM_HOME,但是为了完整和清楚起见,我将这一步包括在内。

  5. 删除已安装的副本

    rm -Rf ${rvm_gemset_path}/gems/mygem-${version}

  6. 创建一个指向git仓库工作目录的符号链接。

    ln -s ${PWD} ${rvm_gemset_path}/gems/mygem-${version}

假设您位于git目录中,并且已将GEM_NAME设置为gem的名称,则此bash脚本将以更自动化的方式进行操作。

rvm gemset use --create ${GEM_NAME}-dev
gem build ${GEM_NAME}.gemspec
gem install ${GEM_NAME}*.gem
gem_install_path=$(ruby -e "puts Gem::Specification.find_by_name('${GEM_NAME}').full_gem_path")
mv ${gem_install_path} ${gem_install_path}.bak
ln -s ${PWD} ${gem_install_path}