首页 > 解决方案 > 如何测试具有本地 GEM 依赖项的 GEM,$LOADED_FEATURES 未指向我的本地 GEM

问题描述

我有一个 gem KBuilder::Watch,它使用了我也开发的一堆 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安装到 ASDF 环境中,并且bundle install

我已经使用 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

当我运行应用程序并检查通过数组加载了哪些 ruby​​ 文件时$LOADED_FEATURES,内存中的所有外部依赖代码都来自已安装的 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-watchGEM 中的单元测试中测试了相同的流程,并且$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

本地依赖

标签: rubyrubygems

解决方案


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

require 'bundler/setup'我经常看到但从未理解Bundler Setup的目的的那行提供了部分解决方案,但是;

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

对我来说完整的解决方案只有在我阅读了Rails 如何处理 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

从另一个文件夹运行


推荐阅读