Как мне протестировать драгоценный камень с локальными зависимостями от драгоценных камней, $LOADED_FEATURES не указывает на мои локальные драгоценные камни

#ruby #rubygems

Вопрос:

У меня есть драгоценный камень под названием KBuilder::Watch , который использует кучу драгоценных камней, которые я также разработал.

Обычное управление зависимостями в .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'
 

Эти драгоценные камни ранее были установлены в среду ASDF с помощью RubyGems и 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-смотреть 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
 

Локальные Зависимости

Ответ №1:

Я понял, что проблема связана с окружающей средой, и это заставило меня найти строку кода, которая была автоматически сгенерирована в bin/console файле в моем драгоценном камне.

Линия require 'bundler/setup' , которую я часто видел, но никогда не понимал цели установки пакета, давала частичное решение, но;

Я обнаружил, что добавление require 'bundler/setup' работало только тогда, когда я запускал свой exe-файл из той же папки, что и GEM, но если я запускал его из другой папки, он не улавливал локальные зависимости.

Полное решение для меня появилось только после того, как я прочитал, как rails обрабатывает драгоценные камни, где я узнал, что вам также нужно настроить 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
 

Запуск из другой папки