помилка рейок, не вдалося проаналізувати YAML


76

Після оновлення самоцвітів я отримав таке:

/home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse': couldn't parse YAML at line 182 column 9 (Psych::SyntaxError)
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:119:in `parse'
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:106:in `load'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:6:in `<module:LATEX>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:3:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `each'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `block in require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `each'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler.rb:120:in `require'
    from /home/megas/Work/railscasts/config/application.rb:10:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `block in <top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:27:in `tap'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:27:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

рейки ruby-1.9.2-p136 3.0.3

Намагався перевстановити gem RedCloth, не допомогло, система хоче використовувати лише версію 4.2.3

Будь-яка ідея, як це виправити? Дякую


Який вміст файла YAML, про який йде мова? Там сказано, що є синтаксична помилка, тому проблема, ймовірно, полягає у вашому файлі YAML.
BoltClock

1
Я не працюю з жодним файлом YAML, тому припустив, що це проблема когось іншого.
Megas

яку команду ви виконуєте? ти використовуєш RVM?
Серпень

це трапляється після команд rails console та rails server. так, я використовую rvm
megas

Відповіді:


166

У вас десь недійсний код YAML. Я маю на увазі недійсний для Psych (новий парсер YAML в рубіні).

Якщо ви не можете (або не хочете) виправити свій код YAML, спробуйте завантажити старий парсер YAML (syck), додавши це на початку config/boot.rb

require 'yaml'
YAML::ENGINE.yamler = 'syck'

Я знаю, це просто "швидке і брудне" виправлення


20
Пакет 1.0.10 завантажує Psych як движок YAML за замовчуванням. Psych не працює нормально з рейками (я використовую рейки 3.0.4 та v3.0.3 мали таку ж проблему). Дивіться тут . Рішення: встановіть інший двигун YAML чітко
vicvega

1
Це вирішило мою проблему з тим, що мій файл YAML неправильно завантажує посилання на якір.
Jeremy Mack

3
Це лише швидке виправлення, а не довгострокове рішення. Можливо, у вас є синтаксичні помилки у деяких файлах yaml, які ви повинні замінити.
jonepatr

11
У мене була подібна проблема, і я провів YAML через yamllint.com, щоб перевірити, чи є проблеми. Хоча він повідомляв, що YAML дійсний, він переформатував файл. Я замінив свій старий неробочий YAML на цю переформатовану версію, і вона спрацювала. Проблема вирішена.
Чарльз Ропер

1
Так, для всіх недоброзичливців виправте свій YAML, але ця порада неоціненна , тому що якщо у вас поганий YAML, серіалізований за допомогою syck, і ви хочете перетворити його на дійсний YAML, серіалізований за допомогою psych, вам потрібна можливість використовувати обидва парсери під час те саме рубінове виконання.
gtd

49

Моя звичайна програма Rails 3 також мала цю проблему, оскільки я використовував локалізований файл yaml для дати / часу.

Як ви можете бачити в цьому коміті https://github.com/rails/rails/commit/dc94d81, це можна легко "виправити", розмістивши масив в окремих рядках.

         -    order: [ :year, :month, :day ]
    18  +    order:
    19  +      - :year
    20  +      - :month
    21  +      - :day

2
Дякую, шукав саме цю проблему і вирішив її, хоча це і відрізняється від проблеми вищезазначеного питання :)
Мальте,

1
У мене були проблеми з резиною postgresql.yml, я пройшов через те, що редактор виправляв такі посилання, це спрацювало. Решта гумової конфігурації здавалася чудовою.
Роб

20

Невелика корекція відповіді Пола Раупаха, який при запуску з каталогу рекурсивно знаходить усі файли * .yml у всіх підкаталогах та тестує файл. Я провів це з мого кореневого каталогу Rails.

require 'yaml'

d = Dir["./**/*.yml"]
d.each do |file|
  begin
    puts "checking : #{file}"
    f =  YAML.load_file(file)
  rescue StandardError
    puts "failed to read #{file}: #{$!}"
  end
end

18

Основна причина була описана в багатьох місцях, і я підсумую її ще раз.

Є два за замовчуванням синтаксичний аналізатор yaml Psych - це новий, той, який ви повинні використовувати. Syck - старий, його не підтримують і вмирає, він використовується в даний час як запасний варіант, коли немає лівіамлу (зазвичай нелінукс-системи).

Найголовніше, що у вас десь є якийсь недійсний ямл . Це, швидше за все, у ваших файлах перекладу (у мене були рядки без котирувань, що містять%). Просто спробуйте завантажити всі свої файли yml із файлом YAML.load_file у робочому вікні, і ви побачите, який із них зламаний.


6
Проголосувавши за це, бо ви помиляєтесь. psych не підтримує блоки за замовчуванням, що технічно наближається до стандарту yaml, але порушує існуюче та очікуване використання (серед іншого) рейками. IMO ruby ​​повинен використовувати синтаксичний аналізатор, який одночасно підтримується і підтримує існуюче використання, навіть якщо це використання знаходиться далі від специфікації. Якби тільки таке було. Поки немає, їм слід використовувати syck.
Сара Мей

І я також погоджуюсь із Сарою. Весь цей перехід до pysch був не чим іншим, як головним болем без очевидної цінності. Мій "недійсний yaml" не був недійсним, він просто використовував синтаксис "order: [: year,: month,: day]", що завжди було добре, наскільки я можу зрозуміти (або, турбота)
Роб

Мабуть, версія 1.3 psych розуміє значення за замовчуванням. Можливо :-) Рішення: використовуйте "gem 'psych', '> = 1.3.2'" у Gemfile.
AlexChaffee

13

У мене була ця проблема, оскільки я використовував вкладку замість пробілів


1
так, відчувається, що ми повинні це пережити!
фландер

сліпий після вдивляючись у файл yml у пошуках відсутньої двокрапки.
зухвалий

13

Найкраще виправити свої файли YAML

Ось як використовується irb, щоб вам не потрібна була консоль rails, яка, ймовірно, не працює:

require 'yaml'
YAML::ENGINE.yamler = 'psych'
YAML.load_file('config/locales/xxx.en.yml')

ви отримаєте приємний результат, який повідомляє, де проблема:

Psych::SyntaxError: couldn't parse YAML at line 25 column 17
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:119:in `parse'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:106:in `load'
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:205:in `load_file'
    from (irb):10
    from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'

7

Абсолютно виправте свій код yaml, а не просто "замаскуйте" справжню проблему, змусивши YAMl використовувати "syck". У мене була та сама проблема, і я знайшов неправильно сформовані оператори yml у своїх файлах локалізації. Якщо ви просто змусите використовувати старий парсер, то ви не отримаєте переваг від усієї роботи над новим парсером в іншому місці вашого проекту.


1
немає ніяких переваг, які я можу виявити за допомогою нового синтаксичного аналізатора, лише повідомлення про загадкові помилки (я зараз переглядаю "Невідома помилка в рядку 1, col 16" файлу, який не має col 16 у рядку 1) у явно правильному YAML файли, які проаналізували попередню версію psych. Нескінченні виправлення помилок та регресії - це порядок денний. Тож не стань кайфом і могутнім, це нескінченний головний біль.
Роб

7

Проблема з оригінальним запитанням була у RedCloth. У мене виникла та сама проблема, і просто оновлення до останньої версії коштовності RedCloth (на даний момент 4.2.7) вирішило проблему.

Вищевказані поради від Honza та FlyboyArt слушні, і вам слід виправити будь-який власний YAML, який у вас є, але оскільки RedCloth настільки ж популярний, як і він, більшість користувачів, які також знаходять це питання, які також використовують RedCloth, повинні переконатися, що в GemFile додано цей рядок:

gem 'RedCloth', ">= 4.2.7"

4

Для інших, хто читає це, я отримав цю помилку, зробивши друкарську помилку в конфігурації бази даних - /config/database.yml


Помилки включають не додавання нового рядка до кінця файлу, мабуть ...!
Алан Девід Гарсія

3

Це випуск пакета 1.0.10: докладніше тут

Спробуйте просто зменшити пакет


я використовую 1.0.10, ви маєте на увазі чекати нової версії?
Megas

1
Я вирішив повернутися до пакету 1.0.7. Сподіваюся, це буде виправлено у наступній версії
vicvega

Я використовую Bundler версії 1.1.3, і він все ще робить це.
Дін Перрі,

2

У моїй причині це виправлено, це справді неправильний файл перекладу YAML у:

config/locales/bg.yml

Виправлено помилку YAML, і все було добре. :-)


не допомогло, можливо моя помилка в іншому файлі YAML, як дізнатись, де помилився файл YAML?
megas

2

Для тих, хто займається цією проблемою, я щойно виявив, що мій database.yml ініціював цю помилку, оскільки між паролем: ключовим словом та паролем у нього не було пробілу. Майже невидима помилка та з базою даних.yml, яка працювала без помилок на попередній версії рейок.


2

Я отримав цю помилку від спроби підключитися до віддаленої бази даних за допомогою пароля 'p@ssword'і зрозумів, що психіці не подобається '@'символ. Змінено пароль БД і вирішено проблему.


2

У мене була ця проблема. Моя проблема полягала в тому, що у моєму файлі database.yml з’явилася додаткова вкладка.


Я забув поставити вкладку між Паролем: та "моїм паролем"
EE33,

2

Я зіткнувся з цим, коли використовував бібліотеку r18n у програмі, яку будуюSinatra , і у своєму файлі перекладу я мав таке:

day: !!pl
  0: 0 days
  1: 1 day
  n: %1 days

який раніше працював чудово в старому проекті Ruby 1.8.7, але який зазнав невдачі Ruby 1.9.3.

Відповідь @SB дав мені підказку, яка мені потрібна для вирішення моєї проблеми. Новіший YAML був протистоянням на %1. Деякі швидкі копання та експеримент, irbі я тепер знаю, що нова версія YAMLпарсера вимагає від вас наводити лапки навколо рядків, які починаються з %1, тому я просто змінив свій переклад на

day: !!pl
  0: 0 days
  1: 1 day
  n: "%1 days"

і вуаля - неприємне повідомлення про помилку зникло.


2

У моєму випадку це не проблема набору: (передбачається Ruby 1.9)

  • Ruby за замовчуванням використовує 'psych' (новіша та підтримувана бібліотека yaml, що посилається на бібліотеку C: libyaml), якщо присутній libyaml
  • В іншому випадку Ruby використовує "syck" (старий і не підтримується)
  • YAML :: ENGINE.yamler = 'syck', таким чином, змусить Ruby використовувати 'syck' на машині, де також встановлено 'psych'

Більше інформації тут: вимагайте, щоб "yaml" не використовував психіку за замовчуванням


Дякую. Моє - це також проблема вибуху.
user456584

2

Мені вдається виправити цю проблему, встановивши gem psych всередині групи: development і: test.

gem 'psych'


1

Хоча відповідь, надана @Vicvega, може працювати, а може і не працювати (не перевіряла), вона суперечить загальному принципу Rails та Ruby "Конвенція щодо конфігурації" і до неї слід ставитись обережно (і навіть більше у спільній роботі) ,, навіть хоча "конфігурація" в цьому випадку не велика

тому мій голос проходить (якщо б я міг проголосувати) за тих, хто запропонував усунути синтаксичні помилки у файлах YAML.

тепер ... щоб вирішити помилку, для мене це була якась помилка newby, у мене не було локального файлу, який я визначив за замовчуванням Config/application.rbу своєму Config/localesкаталозі

щасливого кодування


1

Потрібно перевірити .yml-файли на наявність помилок, я знайшов проблему в своїй базі даних.yml


1

У мене була подібна проблема з неправильно сформованим файлом перекладу YAML. Він використовував змінну до її визначення. Неправильним було наступне:

...
messages:
  ...
  <<: *errors_messages
...
messages: &errors_messages
...

Його потрібно було змінити на:

...
messages: &errors_messages
...
messages:
  ...
  <<: *errors_messages
...

Потім він знову запрацював.


1

У моєму випадку було 2 питання.

  1. Як згадував @stwienert, представлення масиву було проблемою.
  2. Ще одна річ: якщо рядок починається з% {var}, я отримую виняток Parse. Мені довелося змінити рядки відповідно, щоб уникнути початку з% {var}

Наприклад, якщо рядок був

%{user_name} welcome to %{application_name} - Це призвело до помилки

Щоб це виправити, мені довелося змінити його на

Hi, %{user_name} welcome to %{application_name}

Сподіваюся, це комусь допомагає.

З повагою,

Шардул.


Ви могли б просто змінити YAMLфайл, щоб поставити лапки навколо вашого рядка, так hello: %{user_name} welcome to %{application_name}стає hello: "%{user_name} welcome to %{application_name}"замість того, щоб міняти своє речення, а це візок, що веде коня.
Dave Sag

1

Ну, на всякий випадок, якщо це допоможе ...
Що я зробив:
- виберіть все та скопіюйте з https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml у нову версію. yml з notepad ++
- спробував переглянути цей новий файл за допомогою текстового редактора IDE netBeans, я отримав попередження про безпечне завантаження з utf8 (не можу згадати точний текст). Отже, не відкривав його за допомогою цього текстового редактора.
- змінив локальну через конфігурацію / application.rb i18n
- коли я завантажив сторінку irb, я отримав "не вдалося проаналізувати YAML у рядку 0, стовпець 0", посилаючись на Psych.
- Пішов до IRB і завантажив файл із syck, все було нормально; перейшов на психіку і отримав ту ж помилку.

Як я це вирішив:
- повернувся, щоб скопіювати вміст з https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml, але цього разу я вставив його у щойно створений файл з редактор netBeans.
- перезапущений webRick.
- проблема вирішена.
З повагою,
Вікторе


1

Видаліть невикористані бази даних з database.rb. Якщо ви використовуєте MySQL, а PostgreSQL відсутній, видаліть код бази даних PG з databases.yml.


1

Синтаксичний розбір Пшича смоктаний до глибини душі. Я не впевнений, що це елегантне рішення, але мені вдається вирішити цю проблему, видаливши її.

gem uninstall psych

Це дає мені таку помилку:gem "psych" cannot be uninstalled because it is a default gem
Пол Версхур,

1

У мене була дуже, дуже дивна проблема, тому що після цього у мене були місця. Наприклад:

title: "NASA"

Не спрацювало, але

title:"NASA"

Зробила.


1

Якщо ви схожий на мене і стикаєтесь із проектом (успадкованим) із сотнями світильників, кілька рядків Ruby можуть заощадити ваші години:

require 'yaml'

d = Dir.new('test/fixtures/')
d.each do |file|
  begin
     f =  YAML.load_file('test/fixtures/' + file)
  rescue StandardError
     puts "failed to read test/fixtures/#{file}: #{$!}"
   end
 end

Просто помістіть його у свій корінь Rails та запустіть, після закінчення видаліть у кошик.


0

Для інших людей, які дивляться на це, я знайшов проблему, до rerun.txtякої викликав користувач config/cucumber.ymlу програмі Rails. rerun.txtбуло налаштовано для зберігання останнього тесту на огірок, і я якось ввів у консоль дивні символи для тесту на огірок.

Це було важко знайти. Як би я не бачив відповіді Глена Ремпе деякий час тому.


0

Однією з можливих причин є відображення значень, не дозволених у цьому контексті в рядку ...

Ось неправильний приклад YAML (користувач: насправді не повинен містити жодного значення, оскільки він містить дочірні елементи some_key та some_other_key)

customer: Customer
user: User
  some_key: value
  some_other_key: value 2

Знайти таку проблему не є тривіальним завданням, особливо якщо у вас величезний файл YAML.

Я створив досить простий регулярний вираз для виявлення таких речей. Я перевірив це в RubyMine

^(\s+)['"\w]+:\s?['"\w]+.*\n\1\s\s

Будь обережний! Це не працює коректно зі спеціальними символами, такими як å ø æ тощо.

Повідомте мене в коментарях, чи це вам вдалось :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.