Schienenfehler, YAML konnte nicht analysiert werden

76

Nach dem Aktualisieren der Edelsteine ​​habe ich Folgendes:

/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 Schienen 3.0.3

Versucht, Edelstein RedCloth neu zu installieren, hat nicht geholfen, System will nur 4.2.3 Version verwenden

Irgendeine Idee, wie man das behebt? Vielen Dank

Megas
quelle
Was ist der Inhalt der fraglichen YAML-Datei? Es heißt, dass ein Syntaxfehler vorliegt, sodass das Problem wahrscheinlich in Ihrer YAML-Datei liegt.
BoltClock
1
Ich arbeite nicht mit einer YAML-Datei, daher habe ich angenommen, dass dies das Problem eines anderen ist.
Mega
Welchen Befehl führen Sie aus? Verwenden Sie RVM?
Augusto
Dies geschieht nach den Befehlen Rails Console und Rails Server. Ja Im rvm mit
Megas
siehe dieses Commit github.com/rails/rails/commit/dc94d81
Greg Dan

Antworten:

166

Sie haben irgendwo einen ungültigen YAML-Code. Ich meine ungültig für Psych (den neuen Ruby YAML Parser).

Wenn Sie Ihren YAML-Code nicht reparieren können (oder wollen), versuchen Sie, den alten YAML-Parser (syck) zu laden, und fügen Sie diesen am Anfang von hinzu config/boot.rb

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

Ich weiß, es ist nur eine schnelle und schmutzige Lösung

Vicvega
quelle
20
Bundler 1.0.10 lädt Psych standardmäßig als YAML-Engine. Psych funktioniert nicht gut mit Rails (ich verwende Rails 3.0.4 und v3.0.3 hatte das gleiche Problem). Siehe hier . Lösung:
Stellen Sie
1
Dies hat mein Problem behoben, dass meine YAML-Datei die Ankerreferenzen nicht richtig lädt.
Jeremy Mack
3
Dies ist nur eine schnelle Lösung und keine langfristige Lösung. Wahrscheinlich haben Sie Syntaxfehler in einigen Ihrer Yaml-Dateien, die Sie stattdessen beheben sollten.
Jonepatr
11
Ich hatte ein ähnliches Problem und habe meine YAML über yamllint.com ausgeführt , um festzustellen , ob es Probleme gab. Obwohl gemeldet wurde, dass die YAML gültig ist, wurde die Datei neu formatiert. Ich habe meine alte nicht funktionierende YAML durch diese neu formatierte Version ersetzt und es hat funktioniert. Problem gelöst.
Charles Roper
1
Ja, für alle Neinsager, korrigieren Sie Ihre YAML, aber dieser Tipp ist von unschätzbarem Wert , denn wenn Sie eine schlechte YAML haben, die mit syck serialisiert wurde, und Sie sie in eine gültige YAML konvertieren möchten, die mit psych serialisiert wurde, müssen Sie die Fähigkeit haben, beide Parser während des zu verwenden gleiche Rubinausführung.
GTD
49

Meine reguläre Rails 3-App hatte ebenfalls dieses Problem, da ich eine lokalisierte Yaml-Datei für Datum / Uhrzeit verwendete.

Wie Sie in diesem Commit https://github.com/rails/rails/commit/dc94d81 sehen können, kann dies einfach "behoben" werden, indem das Array in separaten Zeilen platziert wird.

         -    order: [ :year, :month, :day ]
    18  +    order:
    19  +      - :year
    20  +      - :month
    21  +      - :day
stwienert
quelle
2
Danke, habe genau nach diesem Problem gesucht und es gelöst, obwohl dies anders ist als das Problem der obigen Frage :)
Malte
1
Ich hatte Probleme mit dem Gummi-postgresql.yml, ging mit dem Editor durch und reparierte die Referenzen wie folgt, es funktionierte. Der Rest der Gummikonfiguration schien in Ordnung zu sein.
Rob
20

Eine kleine Änderung an Paul Raupachs Antwort, die, wenn sie aus einem Verzeichnis ausgeführt wird, alle * .yml-Dateien rekursiv in allen Unterverzeichnissen findet und die Datei testet. Ich habe es von meinem Rails-Root-Verzeichnis aus ausgeführt.

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
Glenn Rempe
quelle
18

Die Grundursache wurde an vielen Stellen beschrieben und ich werde sie noch einmal zusammenfassen.

Es gibt zwei Standard-Yaml-Parser. Psych ist der neue, den Sie verwenden sollten. Syck ist das alte, es wird nicht gewartet und stirbt, es wird derzeit als Ersatz verwendet, wenn kein Libyaml vorhanden ist (normalerweise Nicht-Linux-Systeme).

Das Wichtigste ist , dass Sie irgendwo ein ungültiges Yaml haben . Es befindet sich höchstwahrscheinlich in Ihren Übersetzungsdateien (ich hatte nicht zitierte Zeichenfolgen mit%). Versuchen Sie einfach, alle Ihre yml-Dateien mit YAML.load_file auf die Produktionsbox zu laden, und Sie werden sehen, welche die defekte ist.

Honza
quelle
6
Downvoting dies, weil Sie falsch liegen. psych unterstützt keine Standardblöcke, die technisch näher am Yaml-Standard liegen, bricht jedoch die vorhandene und erwartete Nutzung durch (unter anderem) Schienen. IMO Ruby sollte einen Parser verwenden, der sowohl beibehalten wird als auch die vorhandene Verwendung unterstützt, auch wenn diese Verwendung weiter von der Spezifikation entfernt ist. Wenn es nur so etwas gäbe. Bis dahin sollten sie syck verwenden.
Sarah Mei
Und ich stimme auch Sarah zu. Dieser ganze Schritt zu Pysch war nichts anderes als Kopfschmerzen ohne offensichtlichen Wert. Mein "ungültiges Yaml" war nicht ungültig, es wurde nur die Syntax "order: [: year ,: month ,: day]" verwendet, die meines Erachtens immer in Ordnung war (oder sich darum kümmert)
Rob
Anscheinend versteht Version 1.3 von psych Standardwerte. Vielleicht :-) Lösung: Verwenden Sie "gem 'psych', '> = 1.3.2'" in Gemfile.
AlexChaffee
13

Ich hatte dieses Problem, weil ich anstelle von Leerzeichen einen Tabulator verwendet hatte

flunder
quelle
1
Ja, es fühlt sich so an, als ob wir darüber hinweg sein sollten!
Flunder
blind, nachdem Sie auf eine yml-Datei gestarrt haben, die nach einem fehlenden Doppelpunkt sucht.
daslicious
13

Am besten reparieren Sie Ihre YAML-Dateien

So verwenden Sie irb, damit Sie die Rails-Konsole nicht benötigen, die wahrscheinlich nicht funktioniert:

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

Sie erhalten eine schöne Ausgabe, die Ihnen sagt, wo das Problem liegt:

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>'
Christian Sommerauer
quelle
7

Korrigieren Sie unbedingt Ihren Yaml-Code und maskieren Sie nicht nur das eigentliche Problem, indem Sie YAMl zwingen, "syck" zu verwenden. Ich hatte das gleiche Problem und fand in meinen Lokalisierungsdateien fehlerhafte yml-Anweisungen. Wenn Sie nur die Verwendung des älteren Parsers erzwingen, erhalten Sie nicht die Vorteile aller Arbeiten am neuen Parser an anderer Stelle in Ihrem Projekt.

FlyboyArt
quelle
1
Es gibt keine Vorteile, die ich mit dem neuen Parser erkennen kann, nur kryptische Fehlermeldungen (ich sehe derzeit "Fehler unbekannt in Zeile 1, Spalte 16" einer Datei, die keine Spalte 16 in Zeile 1 enthält) in scheinbar korrekter YAML Dateien, die mit der vorherigen Version von psych analysiert wurden. Endlose Fehlerbehebungen und Regressionen sind an der Tagesordnung. Also nicht hoch und mächtig werden, das sind endlose Kopfschmerzen.
Rob
7

Das Problem mit der ursprünglichen Frage war in RedCloth. Ich hatte das gleiche Problem und durch einfaches Aktualisieren auf die neueste Version des RedCloth-Gems (derzeit 4.2.7) wurde das Problem behoben.

Die obigen Ratschläge von Honza und FlyboyArt sind zutreffend und Sie sollten jede benutzerdefinierte YAML korrigieren, die Sie haben. Da RedCloth jedoch genauso beliebt ist, sollten die meisten Benutzer, die diese Frage finden und auch RedCloth verwenden, sicherstellen, dass in ihrem GemFile diese Zeile hinzugefügt wurde:

gem 'RedCloth', ">= 4.2.7"
tiddy
quelle
4

Bei anderen, die dies lesen, wurde dieser Fehler angezeigt, nachdem ich in meiner Datenbankkonfiguration einen Tippfehler gemacht hatte. /config/database.yml

David
quelle
Zu den Tippfehlern gehört anscheinend, dass am Ende der Datei keine neue Zeile eingefügt wird ...!
Alan David Garcia
3

Es ist ein Bundler 1.0.10-Problem: Details hier

Versuchen Sie einfach, den Bundler herunter zu aktualisieren

Vicvega
quelle
Ich benutze 1.0.10, du meinst auf neue Version warten?
Mega
1
Ich habe es gelöst, auf Bundler 1.0.7 zurückzukommen. Ich hoffe, dass dies in der nächsten Version
behoben wird
Ich verwende Bundler Version 1.1.3 und es funktioniert immer noch.
Dean Perry
2

Was es in meiner Sache behoben hat, war in der Tat eine fehlerhafte YAML-Übersetzungsdatei in:

config/locales/bg.yml

Der YAML-Fehler wurde korrigiert und alles war in Ordnung. :-)

dimitarvp
quelle
hat nicht geholfen, vielleicht mein Fehler in einer anderen YAML-Datei, wie man herausfindet, wo eine falsche YAML-Datei ist?
Mega
2

Für diejenigen, die dieses Problem verfolgen, habe ich gerade festgestellt, dass meine database.yml diesen Fehler auslöste, da zwischen dem Kennwort: keyword und dem Kennwort kein Leerzeichen stand. Ein fast unsichtbarer Fehler und mit einer database.yml, die bei einer früheren Version von Rails fehlerfrei funktioniert hatte.

Anita Graham
quelle
2

Ich habe diesen Fehler erhalten, als ich versucht habe, mit dem Passwort eine Verbindung zu einer entfernten Datenbank herzustellen, 'p@ssword'und festgestellt, dass psych das '@'Symbol nicht mag . Das DB-Passwort wurde geändert und das Problem behoben.

Wantrapreneur
quelle
2

Ich hatte dieses Problem. Mein Problem war, dass ich eine zusätzliche Registerkarte in meiner Datei database.yml hatte.

Tim
quelle
Ich habe vergessen, einen Tabulator zwischen dem Passwort: und 'meinem Passwort' zu setzen
EE33
2

Ich bin darauf gestoßen, als ich die r18n-Bibliothek in einer SinatraApp verwendet habe, die ich erstelle , und in meiner Übersetzungsdatei hatte ich Folgendes:

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

was früher in einem älteren Projekt unter gut funktionierte Ruby 1.8.7, aber unter scheiterte Ruby 1.9.3.

Eine Antwort von @SB gab mir den Hinweis, den ich brauchte, um mein Problem zu lösen. Die neuere YAML sträubte sich gegen die %1. Ein bisschen schnelles Graben und ein Experiment mit irbund ich weiß jetzt, dass die neuere Version des YAMLParsers erfordert, dass Sie Anführungszeichen um Zeichenfolgen setzen, die mit beginnen %1, also habe ich einfach meine Übersetzung geändert

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

und voila - böse Fehlermeldung verschwand.

Dave Sag
quelle
2

In meinem Fall handelt es sich nicht um ein Bundle-Problem: (Ruby 1.9 wird angenommen)

  • Ruby verwendet standardmäßig 'psych' (neuere und gepflegte Yaml-Bibliothek, die mit der C-Bibliothek verknüpft ist: libyaml), wenn libyaml vorhanden ist
  • Andernfalls verwendet Ruby 'syck' (alt und nicht gepflegt)
  • YAML :: ENGINE.yamler = 'syck' zwingt Ruby daher, 'syck' auf einem Computer zu verwenden, auf dem auch 'psych' installiert ist

Weitere Infos hier: require "yaml" verwendet psych nicht als Standard

Gamov
quelle
Vielen Dank. Meins ist auch ein Redmine-Problem.
user456584
2

Ich schaffe es, dieses Problem zu beheben, indem ich gem psych in group: development und: test installiere.

gem 'psych'
Thaha kp
quelle
1

Ich hatte das gleiche Problem mit Ruby 1.9.2-p180, das durch 1.9.2-p290 gelöst wurde

Jakob Cosoroaba
quelle
1

Obwohl die Antwort von @Vicvega möglicherweise funktioniert oder nicht (hat sie nicht getestet), verstößt sie gegen das gemeinsame Prinzip "Konvention über Konfiguration" von Rails und Ruby und sollte mit Sorgfalt behandelt werden (und noch mehr in der Zusammenarbeit) obwohl die "Konfiguration" in diesem Fall nicht großartig ist

Also geht meine Stimme (wenn ich stimmen könnte) für diejenigen, die vorgeschlagen haben, die Syntaxfehler in den YAML-Dateien zu beseitigen.

Jetzt ... um den Fehler zu beheben, war es für mich eine Art Newby-Fehler. Ich hatte nicht die Gebietsschemadatei, die ich als Standard definiert hatte, Config/application.rbin meinem Config/localesVerzeichnis

fröhliche Codierung

juanm55
quelle
1

Müssen .yml-Dateien auf Fehler überprüft werden, habe ich ein Problem in meiner database.yml gefunden

Chaitanya
quelle
1

Ich hatte ein ähnliches Problem mit einer fehlerhaften YAML-Übersetzungsdatei. Es wurde eine Variable verwendet, bevor sie definiert wurde. Folgendes war falsch:

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

Es musste geändert werden zu:

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

Dann fing es wieder an zu arbeiten.

Remo
quelle
1

In meinem Fall gab es 2 Probleme.

  1. Wie von @stwienert erwähnt, war die Array-Darstellung ein Problem.
  2. Eine weitere Sache war, wenn ein String mit% {var} begann, erhielt ich eine Parse-Ausnahme. Ich musste die Zeichenfolgen entsprechend ändern, um nicht mit% {var} zu beginnen

Zum Beispiel, wenn die Zeichenfolge war

%{user_name} welcome to %{application_name} - Dies warf einen Fehler

Um das Problem zu beheben, musste ich es ändern

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

Hoffe das hilft jemandem.

Grüße,

Shardul.

SB.
quelle
Sie könnten einfach die veränderte YAMLDatei Anführungszeichen um die Zeichenfolge zu setzen, so hello: %{user_name} welcome to %{application_name}wird hello: "%{user_name} welcome to %{application_name}"anstatt Ihren Satz ändern zu müssen, die der Wagen das Pferd führt , ist.
Dave Sag
1

Nun, nur für den Fall, dass dies hilft ...
Was ich getan habe:
- Alle auswählen und von https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml in ein neues es kopieren . yml mit notepad ++
- Ich habe versucht, diese neue Datei mit dem netBeans IDE-Texteditor anzusehen. Ich habe eine Warnung zum sicheren Laden mit utf8 erhalten (kann den genauen Text nicht abrufen). Daher wurde es mit diesem Texteditor nicht geöffnet.
- wechselte die lokale durch configuration / application.rb i18n
- als ich eine irb-Seite lud, bekam ich "konnte YAML in Zeile 0 Spalte 0 nicht analysieren" mit Bezug auf Psych.
- Ging zum IRB und lud die Datei mit Syck, es war in Ordnung; wechselte zu psych und bekam den gleichen Fehler.

Wie ich es gelöst habe:
- ging zurück, um den Inhalt von https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml zu kopieren, aber dieses Mal habe ich ihn in eine neu erstellte Datei mit eingefügt netBeans-Editor.
- webRick neu gestartet.
- Problem gelöst.
Beste Grüße,
Victor

Victor Maidana
quelle
1

Entfernen Sie nicht verwendete Datenbanken aus database.rb. Wenn Sie MySQL verwenden und kein PostgreSQL vorhanden ist, löschen Sie den PG-Datenbankcode aus databases.yml.

Vijay
quelle
1

Pshych Parse ist bis ins Mark saugen. Ich bin nicht sicher, ob dies eine elegante Lösung ist, aber ich schaffe es, dieses Problem durch Deinstallation zu beheben.

gem uninstall psych
sovanlandy
quelle
Dies gibt mir den folgenden Fehler:gem "psych" cannot be uninstalled because it is a default gem
Paul Verschoor
1

Ich hatte ein sehr, sehr seltsames Problem, weil ich danach Leerzeichen hatte. Z.B:

title: "NASA"

Hat nicht funktioniert, aber

title:"NASA"

Hat.

andrewmart.in
quelle
1

Wenn Sie wie ich sind und vor einem Projekt (geerbt) mit Hunderten von Fixtures stehen, können Sie mit ein paar Zeilen Ruby Stunden sparen:

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

Legen Sie es einfach in Ihr Rails-Stammverzeichnis und führen Sie es aus. Wenn Sie fertig sind, werfen Sie es in den Papierkorb.

Paul Raupach
quelle
0

Für andere Leute, die sich das anschauten, fand ich das Problem, bei rerun.txtdem config/cucumber.ymlin einer Rails-App angerufen wurde . rerun.txtwurde konfiguriert, um den letzten Gurken-Fehlertest zu speichern, und ich hatte irgendwie seltsame Zeichen für einen Gurkentest in die Konsole eingegeben.

Das war schwer zu finden. Ich wünschte, ich hätte Glenn Rempes Antwort vor einiger Zeit gesehen.

webdevguy
quelle
0

Eine der möglichen Ursachen ist, dass Mapping-Werte in diesem Zusammenhang in Zeile ... nicht zulässig sind.

Hier ist ein falsches YAML-Beispiel (Benutzer: sollte eigentlich keinen Wert enthalten, da es untergeordnete Elemente some_key und some_other_key enthält)

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

Es ist keine triviale Aufgabe, ein solches Problem zu finden, insbesondere wenn Sie eine riesige YAML-Datei haben.

Ich habe einen ziemlich einfachen regulären Ausdruck erstellt, um solche Dinge zu erkennen. Ich habe es in RubyMine überprüft

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

Achtung! Es funktioniert nicht richtig mit speziellen Zeichen wie å ø æ usw.

Lass es mich in den Kommentaren wissen, wenn es für dich funktioniert hat :)

Serge Seletskyy
quelle