#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