Helpers - компьютеры, интернет, программирование

Ошибка установки Rspec — неверный аргумент

Я только что перешел на новый ноутбук, работающий на Win 10/ruby 2.2.2/Rails 4.2.0 (без проблем на предыдущей Win 8 ruby ​​2.0.0/Rails 4.2/rspec 3.2). Теперь при установке rspec ниже странная ошибка:

$ rails g rspec:install
   identical  .rspec
       exist  spec
      create  spec/C:/Users/Jun C/AppData/Local/Temp/d20160219-10996-1x6hu8w/spec/spec_helper.rb
C:/Ruby22-x64/lib/ruby/2.2.0/fileutils.rb:252:in `mkdir': Invalid argument @ dir_s_mkdir - C:/D/code/rails_proj/engines/simple_orderx/spec/C: (Errno::EINVAL)
        from C:/Ruby22-x64/lib/ruby/2.2.0/fileutils.rb:252:in `fu_mkdir'
        from C:/Ruby22-x64/lib/ruby/2.2.0/fileutils.rb:226:in `block (2 levels) in mkdir_p'
        from C:/Ruby22-x64/lib/ruby/2.2.0/fileutils.rb:224:in `reverse_each'
        from C:/Ruby22-x64/lib/ruby/2.2.0/fileutils.rb:224:in `block in mkdir_p'
        from C:/Ruby22-x64/lib/ruby/2.2.0/fileutils.rb:210:in `each'
        from C:/Ruby22-x64/lib/ruby/2.2.0/fileutils.rb:210:in `mkdir_p'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor/actions/create_file.rb:61:in `block in invoke!'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor/actions/empty_directory.rb:116:in `call'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor/actions/empty_directory.rb:116:in `invoke_with_conflict_check'
        from C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/thor-0.19.1/lib/thor/actions/create_file.rb:60:in `invoke!'

В корневом каталоге приложения Rails есть /spec. Файл spec-helper должен быть сгенерирован под /spec как /spec/spec-helper.rb. Однако установка попыталась сгенерировать spec-helper в spec/C:/Users/Jun C/AppData/Local/Temp/d20160219-10996-1x6hu8w/spec/. Кажется, что путь неправильный.

Вот строка в Gemfile:

s.add_development_dependency "rspec-rails", ">= 3.2.0"

Вот конфиг в engine.rb

   config.generators do |g|
      g.template_engine :erb
      g.integration_tool :rspec
      g.test_framework :rspec
      g.fixture_replacement :factory_girl, :dir => "spec/factories"  
    end  

Версия rspec — 3.2.2. Как исправить этот неправильный путь при установке rspec?

20.02.2016


Ответы:


1

Моя среда

  • Windows 10
  • рубин 2.4.4p296 (версия 63013 28 марта 2018 г.) [x64-mingw32]
  • Рельсы 5.2.0
  • rspec-рельсы (3.7.2)
  • Тор (0.20.0)

TL;DR

Поскольку Dir.mktmpdir (используется RSpec-rails) и Dir.glob (используется Thor) возвращают несоответствующие пути к пользовательским каталогам в Windows 10, Thor не может правильно генерировать относительные пути, что приводит к недопустимым путям, что приводит к сбою операций с файлами. Эта проблема уникальна для Windows 10. Убедитесь, что ваши драгоценные камни RSpec-rails и Thor обновлены. Если это не решит вашу проблему, см. обходной путь ниже.

Под капотом

Команда rails generate rspec:install:

  1. создает временный каталог
  2. заполняет его нужными файлами
  3. использует Thor для копирования этих файлов в ваше приложение Rails

RSpec-rails использует Dir.mktmpdir на первом этапе. В Windows 10 результирующий путь выглядит так:

Dir.mktmpdir() => C:/Users/BEN~1.AMO/AppData/Local/Temp/...

Этот путь получен из переменной среды Windows 10 TMP:

irb(main):005:0> ENV['TMP']
=> "C:\\Users\\BEN~1.AMO\\AppData\\Local\\Temp"

Тор использует Dir.glob при поиске файлов для копирования на третьем шаге. В Windows 10 найденные пути выглядят так:

Dir.glob(lookup, File::FNM_DOTMATCH) => C:/Users/ben.amos/AppData/Local/Temp/...

Эти пути получены из переменной окружения HOME:

irb(main):006:0> ENV['HOME']
=> "C:/Users/ben.amos"

Когда Thor находит файл для копирования с помощью Dir.glob, он сначала пытается получить относительный путь, удаляя часть пути временного каталога, созданную Dir.mktmpdir. Но поскольку пути Dir.glob и Dir.mktmpdir не совпадают, String.gsub ничего не делает, абсолютный путь сохраняется, последующие операции с файловыми путями создают недопустимую строку пути и... БУМ. Копия не работает, как описывает ОП.

Если вам интересно, вы можете сами проверить это поведение, просмотрев эти два файла:

RSpec-rails gem: lib\generators\rspec\install\install_generator.rb
Thor gem: lib\thor\actions\directory.rb

Обходной путь

Самый простой и наименее инвазивный обходной путь, который я смог создать, — это временно установить ENV['TMP'] на что-то другое. Вы можете сделать это в начале процесса установки Rails. Просто используйте какой-то путь, не зависящий от пользователя, например:

  1. Откройте config/application.rb.
  2. Добавьте следующее в конец вашего класса Application.

    ENV['TMP'] = 'C:/Windows/Temp' # or any other valid temp directory

  3. Выполнить rails generate rspec:install.

  4. Удалите строку, добавленную на шаге 2.

Как только нужные файлы будут на месте, вам больше не придется об этом беспокоиться.

Формальное исправление

Либо RSpec должен использовать другой временный каталог для нас, Windows, либо Thor должен использовать более разумную логику для своих путей. На Github Тора есть открытый билет.

26.06.2018

2

Думаю, самое быстрое решение - использовать правильные версии, вы можете использовать:

gem 'rails', '4.2.3'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc

gem 'web-console', '~> 2.0', group: :development

group :development, :test do
  gem 'byebug'
  gem 'spring'
end

group :test do
 gem 'rspec-rails', '~> 3.0'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'capybara', '~> 2.4.4'
gem 'poltergeist', '~> 1.6.0'
gem 'phantomjs', '~> 1.9.8.0'
gem 'bootstrap-sass'
gem 'minitest'
11.07.2016
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..