Ваша проблема GitHub была решена автором. Вы можете установить гем из GitHub, и он будет работать так, как вы ожидаете.
Проблема в том, что вы не можете легко установить гем с помощью gem install
. (если только вы не клонируете репозиторий, не соберете драгоценный камень и не установите драгоценный камень из вашей файловой системы, но это не переносимое решение). И если вы не можете использовать gem install
, то вы не можете использовать require 'csv'
, потому что это будет просто использовать версия с ошибками, которую вы уже установили. (аналогично, клонирование репо и использование require '/path/to/csv-3.0.4'
не является переносимым решением)
Обходной путь - использовать bundler для установки фиксированного гема в путь вашего пакета:
# Gemfile
gem 'csv', git: 'https://github.com/ruby/csv.git', ref: '7ede8e84a2b8'
Затем запустите bundle install
:
Fetching https://github.com/ruby/csv.git
Resolving dependencies...
Using bundler 1.17.2
Using csv 3.0.4 from https://github.com/ruby/csv.git (at 7ede8e8@7ede8e8)
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
И запустить bundle info csv
, чтобы подтвердить:
bundle info csv
* csv (3.0.4 7ede8e8)
Summary: CSV Reading and Writing
Homepage: https://github.com/ruby/csv
Path: /Users/foo/.rvm/gems/ruby-2.6.0/bundler/gems/csv-7ede8e84a2b8
Затем измените ваш скрипт, чтобы использовать bundler для загрузки драгоценных камней, и укажите версию камня, который вы хотите использовать:
# test.rb
require 'bundler/setup'
Bundler.require :default
gem 'csv', '=3.0.4'
puts CSV::VERSION
(вы не звоните require 'csv'
; упаковщик делает это за вас)
Затем запустите ruby test.rb
и убедитесь, что он использует ожидаемую версию гема:
3.0.4
Теперь измените test.rb
, чтобы включить ваш оригинальный код:
require 'bundler/setup'
Bundler.require :default
gem 'csv', '=3.0.4'
txt =<<TXT
"h1","h2","h3"
1,"test",3
2,"test",6
3,"test",9
TXT
table = CSV::parse(txt, headers: true)
puts table.to_csv + "\n"
table.each do |row|
row << {"h4" => "additional"}
end
puts table.to_csv
И запустить с ruby test.rb
:
h1,h2,h3
1,test,3
2,test,6
3,test,9
h1,h2,h3,h4
1,test,3,additional
2,test,6,additional
3,test,9,additional
Теперь у вас есть переносимое решение, которое будет работать в любой системе и загружать гем из git-репозитория на коммите, где это исправление было реализовано.