ruby - 如何测试具有本地 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-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
解决方案
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
推荐阅读
- java - 将 JUnit 5 @BeforeEach 中的参数传递给单个测试
- php - 为什么 Laravel 邮件不能在实时服务器上运行?
- c# - 不等待异步调用仍然是异步的,对吗?
- ruby-on-rails - Rails (Active Record) - 返回所有字段的列表
- firebase - 为 Firebase 函数中文档的特定参数激活函数 (OnUpdate)
- arm - Fill erased memory with something like assert(false) on ARM Cortex-M4
- mysql - Trying to calculate the conversion rate of customers who just sign a virtual greeting card to eventually buying a card
- javascript - 如何使用 vanilla Node.js 运行 500 个请求,20 个并行
- sql - 生成分层路径
- twincat - TwinCAT 3:将“F_GetSystemTime”与本地 Windows 时间同步?