【问题标题】:How do I test a GEM with local GEM dependencies, $LOADED_FEATURES is not pointing my local GEMs如何测试具有本地 GEM 依赖项的 GEM,$LOADED_FEATURES 未指向我的本地 GEM
【发布时间】:2021-04-03 18:43:59
【问题描述】:

我有一个名为 KBuilder::Watch 的 gem,它使用了我也开发的一堆 GEM。

.gemspec中正常的依赖管理如下:

spec.add_dependency 'k_builder', '~> 0.0'
spec.add_dependency 'k_builder-dotnet', '~> 0.0'
spec.add_dependency 'k_builder-package_json', '~> 0.0'
spec.add_dependency 'k_builder-webpack5', '~> 0.0'
spec.add_dependency 'k_doc', '~> 0.0'
spec.add_dependency 'k_log', '~> 0.0'
spec.add_dependency 'k_util', '~> 0.0'

这些 GEM 之前已通过 RubyGems 和 bundle install 安装到 ASDF 环境中

我已经使用 GemFile 覆盖了它

gem 'k_builder'               , path: '../k_builder'
gem 'k_builder-package_json'  , path: '../k_builder-package_json'
gem 'k_builder-webpack5'      , path: '../k_builder-webpack5'
gem 'k_doc'                   , path: '../k_doc'
gem 'k_log'                   , path: '../k_log'
gem 'k_util'                  , path: '../k_util'

我正在运行 k_builder-watch exe 使用

/Users/username/dev/kgems/k_builder-watch/exe/k_builder-watch

当我运行应用程序并检查通过 $LOADED_FEATURES 数组加载了哪些 ruby​​ 文件时,内存中的所有外部依赖代码都来自已安装的 GEMS 路径而不是本地路径。

my_gems = %w(handlebars-helpers k_builder k_builder-dotnet k_builder-watch k_builder-package_json k_builder-webpack5 k_doc k_log k_util)

loaded_files = $LOADED_FEATURES.select { |gem| my_gems.any? { |my_gem| gem.include?(my_gem) } }.sort

puts loaded_files

我在解决方案方面取得了进展

我刚刚在k_builder-watch GEM 的单元测试中测试了相同的流程,$LOADED_FEATURES 数组中的所有文件现在都指向我的本地依赖项,由此我发现问题是环境问题。

RSpec.describe KBuilder::Watch::Watcher do
  let(:watch_path) { '/Users/davidcruwys/dev/kgems/k_builder-watch/.builders' }

  it {
    watcher = KBuilder::Watch::Watcher.new(watch_path)
    watcher.start
  }
end
my_gems = %w(handlebars-helpers k_builder k_builder-dotnet k_builder-watch k_builder-package_json k_builder-webpack5 k_doc k_log k_util)

loaded_files = $LOADED_FEATURES.select { |gem| my_gems.any? { |my_gem| gem.include?(my_gem) } }.sort

puts loaded_files

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    我发现问题是环境问题,这让我在 GEM 的 bin/console 文件中自动生成了一行代码。

    我经常看到但一直不明白Bundler Setup用途的那行require 'bundler/setup'提供了部分解决方案,但是;

    我发现添加require 'bundler/setup' 仅在我从与 GEM 相同的文件夹中运行我的 exe 时才有效,但如果我从不同的文件夹中运行它,它不会获取本地依赖项。

    完整的解决方案是在我阅读How does rails handle gems 之后才出现的,我发现您还需要配置ENV['BUNDLE_GEMFILE'] 以指向您的 GEM 文件。

    添加代码

    # This is needed to run executable from any folder
    # The GemFile is relative to the project, 
    # but this will force it to be absolute.
    ENV['BUNDLE_GEMFILE'] = gem_path
    
    # Clears the $LOAD_PATH and use paths listed in project GemPath.
    require 'bundler/setup'
    

    启动可执行文件

    #!/usr/bin/env ruby
    
    # frozen_string_literal: true
    
    require 'pry'
    
    lib_path = File.expand_path(File.join(File.dirname(__FILE__), '../lib'))
    gem_path = File.expand_path(File.join(File.dirname(__FILE__), '../Gemfile'))
    
    $LOAD_PATH.unshift(lib_path)
    
    ENV['BUNDLE_GEMFILE'] = gem_path
    require 'bundler/setup'
    
    require 'k_builder/watch'
    
    cli = KBuilder::Watch::Cli.new
    cli.execute
    
    watcher = KBuilder::Watch::Watcher.new(cli.watch_path)
    watcher.start
    

    从 GEM 文件夹运行时

    exe/k_builder-watch ~/dev/csharp/KafeOwner/.builders
    

    从任何其他文件夹运行时

    cd ~/dev/csharp/KafeOwner
    ~/dev/kgems/k_builder-watch/exe/k_builder-watch ./builders
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      相关资源
      最近更新 更多