lỗi đường ray, không thể phân tích cú pháp YAML


76

Sau khi cập nhật các viên ngọc, tôi đã có cái này:

/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 đường ray 3.0.3

Đã cố gắng cài đặt lại gem RedCloth, không giúp được gì, hệ thống chỉ muốn sử dụng phiên bản 4.2.3

Bất kỳ ý tưởng làm thế nào để sửa chữa nó? Cảm ơn


Nội dung của tệp YAML được đề cập là gì? Nó cho biết có lỗi cú pháp, vì vậy vấn đề có thể nằm ở tệp YAML của bạn.
BoltClock

1
Tôi không làm việc với bất kỳ tệp YAML nào, vì vậy tôi cho rằng đó là vấn đề của người khác.
megas

bạn đang chạy lệnh nào? bạn đang sử dụng RVM?
Augusto,

nó xảy ra sau một trong hai lệnh rails console và rails server. vâng, tôi đang sử dụng rvm
megas

Câu trả lời:


166

Bạn có mã YAML không hợp lệ ở đâu đó. Ý tôi là không hợp lệ đối với Psych (trình phân tích cú pháp YAML ruby ​​mới).

Nếu bạn không thể (hoặc không muốn) sửa mã YAML của mình, hãy thử tải trình phân tích cú pháp YAML cũ (syck), thêm mã này vào đầu config/boot.rb

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

Đó chỉ là một sửa chữa 'nhanh chóng và bẩn thỉu', tôi biết


20
Bundler 1.0.10 tải Psych làm công cụ YAML theo mặc định. Psych không hoạt động tốt với rails (Tôi đang sử dụng rails 3.0.4 và v3.0.3 cũng gặp vấn đề tương tự). Xem tại đây . Giải pháp: đặt một công cụ YAML khác một cách rõ ràng
vicvega

1
Điều này đã khắc phục sự cố của tôi với tệp YAML của tôi không tải đúng các tham chiếu neo.
Jeremy Mack

3
Đây chỉ là một sửa chữa nhanh chóng và không phải là một giải pháp lâu dài. Có thể bạn có lỗi cú pháp trong một số tệp yaml của mình mà bạn nên sửa lỗi thay thế.
jonepatr

11
Tôi gặp sự cố tương tự và vì vậy đã chạy YAML của mình qua yamllint.com để xem có vấn đề gì không. Mặc dù nó báo cáo rằng YAML là hợp lệ, nó đã định dạng lại tệp. Tôi đã thay thế YAML cũ không hoạt động của mình bằng phiên bản được định dạng lại này và nó đã hoạt động. Vấn đề đã được giải quyết.
Charles Roper

1
Đối với tất cả những người phản đối, vâng, hãy sửa YAML của bạn, nhưng mẹo này là vô giá , bởi vì nếu bạn có YAML xấu được tuần tự hóa bằng syck và bạn muốn chuyển đổi nó thành YAML hợp lệ được tuần tự hóa bằng psych, bạn cần có khả năng sử dụng cả hai trình phân tích cú pháp trong quá trình cùng một cách thực hiện ruby.
gtd

49

Ứng dụng Rails 3 thông thường của tôi cũng gặp sự cố này, vì tôi đang sử dụng Tệp yaml được bản địa hóa cho Ngày / Giờ.

Như bạn có thể thấy trong cam kết này https://github.com/rails/rails/commit/dc94d81, điều này có thể được "sửa" dễ dàng bằng cách đặt mảng trong các dòng riêng biệt.

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

2
Cảm ơn, đang tìm kiếm chính xác vấn đề đó và nó đã giải quyết nó, mặc dù điều này là khác nhau từ các vấn đề của câu hỏi ở trên :)
Malte

1
Tôi đã gặp sự cố với cao su-postgresql.yml, đã qua trình chỉnh sửa sửa các tham chiếu như thế này, nó đã hoạt động. Phần còn lại của cấu hình cao su có vẻ ổn.
Rob

20

Một chút chỉnh sửa về câu trả lời của Paul Raupach, khi chạy từ một thư mục, nó sẽ tìm thấy tất cả các tệp * .yml một cách đệ quy trong tất cả các thư mục con và kiểm tra tệp. Tôi đã chạy nó từ dir gốc Rails của mình.

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

Nguyên nhân gốc rễ đã được mô tả trên nhiều nơi và tôi sẽ tóm tắt lại.

Có hai trình phân tích cú pháp yaml mặc định Psych là trình mới, trình bạn nên sử dụng. Syck là cái cũ, không được bảo trì và sắp chết, nó hiện đang được sử dụng như một sự cố khi không có libyaml (thường là các hệ thống không linux).

Điều quan trọng là bạn có một số yaml không hợp lệ ở đâu đó . Nó có lẽ nằm trong các tệp bản dịch của bạn (tôi có các chuỗi chưa được trích dẫn mắc kẹt với%). Chỉ cần thử tải tất cả các tệp yml của bạn bằng YAML.load_file trên hộp sản xuất và bạn sẽ thấy tệp nào bị hỏng.


6
Từ chối điều này bởi vì bạn đã sai. psych không hỗ trợ các khối mặc định, về mặt kỹ thuật gần với tiêu chuẩn yaml hơn, nhưng phá vỡ việc sử dụng hiện có và được mong đợi bởi (trong số những thứ khác). IMO ruby ​​nên sử dụng trình phân tích cú pháp vừa được duy trì vừa hỗ trợ cách sử dụng hiện có, ngay cả khi cách sử dụng đó khác xa với thông số kỹ thuật. Giá như có một thứ như vậy. Cho đến khi có, họ nên sử dụng syck.
Sarah Mei

Và tôi cũng đồng ý với Sarah. Toàn bộ việc chuyển sang pysch không có gì khác ngoài một cơn đau đầu vì không có giá trị rõ ràng. "Yaml không hợp lệ" của tôi không phải là không hợp lệ, nó chỉ đang sử dụng cú pháp "order: [: year,: month,: day]", cú pháp luôn ổn theo như tôi có thể nói (hoặc, quan tâm)
Rob

Rõ ràng phiên bản 1.3 của psych hiểu các giá trị mặc định. Có thể :-) Giải pháp: sử dụng "gem 'psych', '> = 1.3.2'" trong Gemfile.
AlexChaffee

13

Tôi gặp sự cố này vì tôi đã sử dụng tab thay vì dấu cách


1
vâng, có vẻ như chúng ta nên vượt qua điều đó!
flunder

mù sau khi nhìn chằm chằm vào tệp yml tìm kiếm dấu hai chấm bị thiếu.
daslicious

13

Tốt nhất là sửa các tệp YAML của bạn

Đây là cách sử dụng irb để bạn không cần bảng điều khiển rails có thể không hoạt động:

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

bạn sẽ nhận được một kết quả tốt cho bạn biết vấn đề là ở đâu:

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

Tuyệt đối sửa mã yaml của bạn không chỉ 'che giấu' vấn đề thực sự bằng cách buộc YAMl sử dụng 'syck'. Tôi cũng gặp sự cố này và tìm thấy các câu lệnh yml không đúng định dạng trong các tệp bản địa hóa của mình. Nếu bạn chỉ buộc sử dụng trình phân tích cú pháp cũ hơn thì bạn sẽ không nhận được lợi ích của tất cả các công việc trên trình phân tích cú pháp mới ở những nơi khác trong dự án của bạn.


1
không có lợi ích nào mà tôi có thể phát hiện với trình phân tích cú pháp mới, chỉ có các thông báo lỗi khó hiểu (tôi hiện đang xem "Lỗi không xác định trên dòng 1, cột 16" của tệp không có cột 16 ở dòng 1) trong YAML rõ ràng các tệp đã phân tích cú pháp bằng phiên bản psych trước đó. Sửa lỗi và hồi quy vô tận là thứ tự trong ngày. Vì vậy, không được cao và hùng mạnh, đây là một đau đầu vô tận.
Rob

7

Vấn đề với câu hỏi ban đầu là ở RedCloth. Tôi đã gặp sự cố tương tự và chỉ cần cập nhật lên phiên bản mới nhất của viên ngọc RedCloth (Hiện tại là 4.2.7) đã khắc phục được sự cố.

Lời khuyên ở trên từ Honza và FlyboyArt là đúng đắn và bạn nên sửa bất kỳ YAML tùy chỉnh nào mà bạn có, nhưng với việc RedCloth đang trở nên phổ biến như hiện nay, hầu hết người dùng tìm thấy câu hỏi này cũng sử dụng RedCloth nên đảm bảo GemFile của họ có thêm dòng này:

gem 'RedCloth', ">= 4.2.7"

4

Đối với những người khác đang đọc bài viết này, tôi đã gặp lỗi này sau khi mắc lỗi đánh máy trong cấu hình cơ sở dữ liệu của mình - /config/database.yml


Các lỗi chính tả bao gồm việc không thêm dòng mới vào cuối tệp, dường như ...!
Alan David Garcia

3

Đó là vấn đề về gói 1.0.10: chi tiết tại đây

Chỉ cố gắng hạ cấp trình gói


Tôi đang sử dụng 1.0.10, ý bạn là đợi phiên bản mới?
megas

1
Tôi đã giải quyết việc quay lại Bundler 1.0.7. Tôi hy vọng điều này sẽ được sửa trong phiên bản tiếp theo
vicvega

Tôi đang sử dụng phiên bản Bundler 1.1.3 và nó vẫn hoạt động.
Dean Perry

2

Điều gì đã khắc phục nó trong nguyên nhân của tôi thực sự là tệp dịch YAML không đúng định dạng trong:

config/locales/bg.yml

Đã sửa lỗi YAML và tất cả đều ổn. :-)


không giúp được, có thể lỗi của tôi trong một tệp YAML khác, làm thế nào để tìm ra tệp YAML bị nhầm lẫn ở đâu?
megas

2

Đối với những người theo đuổi vấn đề này, tôi vừa phát hiện ra rằng database.yml của tôi đã gây ra lỗi này vì nó không có khoảng cách giữa password: từ khóa và mật khẩu. Một lỗi gần như vô hình và với database.yml đã hoạt động mà không có lỗi trên phiên bản cũ hơn của rails.


2

Tôi gặp lỗi này do cố gắng kết nối với một db từ xa bằng mật khẩu 'p@ssword'và phát hiện ra rằng psych không thích '@'biểu tượng. Đã thay đổi mật khẩu DB và sự cố đã được giải quyết.


2

Tôi đã có vấn đề này. Vấn đề của tôi là tôi có thêm một tab trong tệp database.yml của mình.


Tôi quên đặt một tab giữa Mật khẩu: và 'mật khẩu của tôi'
EE33

2

Tôi bắt gặp điều này khi tôi đang sử dụng thư viện r18n trong một Sinatraứng dụng mà tôi đang xây dựng và trong tệp bản dịch của tôi, tôi có những thứ sau:

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

vốn đã từng hoạt động tốt trong một dự án cũ hơn Ruby 1.8.7, nhưng đang thất bại Ruby 1.9.3.

Một câu trả lời của @SB đã cho tôi manh mối mà tôi cần để giải quyết vấn đề của mình. YAML mới hơn đã chùn bước tại %1. Một số thao tác đào nhanh và một thử nghiệm với irbvà bây giờ tôi biết rằng phiên bản mới hơn của YAMLtrình phân tích cú pháp yêu cầu bạn đặt dấu ngoặc kép xung quanh các chuỗi bắt đầu bằng %1, vì vậy tôi đã thay đổi bản dịch của mình thành

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

và thì đấy - thông báo lỗi khó chịu đã biến mất.


2

Đối với trường hợp của tôi, nó không phải là vấn đề Gói: (Ruby 1.9 được giả định)

  • Ruby, theo mặc định, sử dụng 'psych' (thư viện yaml mới hơn và được duy trì liên kết đến thư viện C: libyaml) nếu có libyaml
  • Nếu không, Ruby sử dụng 'syck' (cũ và không được bảo trì)
  • Do đó, YAML :: ENGINE.yamler = 'syck' sẽ buộc Ruby sử dụng 'syck' trên một máy có cài đặt 'psych'

Thông tin thêm tại đây: request "yaml" không sử dụng psych làm mặc định


Cảm ơn. Của tôi cũng là một vấn đề của mìn.
user456584,

2

Tôi quản lý để khắc phục sự cố này bằng cách cài đặt gem psych bên trong nhóm: phát triển và: thử nghiệm.

gem 'psych'

1

Tôi gặp vấn đề tương tự với ruby ​​1.9.2-p180, chuyển đến 1.9.2-p290 đã giải quyết được vấn đề này cho tôi


1

Mặc dù câu trả lời được đưa ra bởi @Vicvega có thể hoạt động hoặc có thể không hoạt động (Không kiểm tra nó), nó đi ngược lại nguyên tắc chung của Rails và Ruby "Quy ước về cấu hình" và cần được xử lý cẩn thận (và thậm chí nhiều hơn trong công việc hợp tác) ,,, thậm chí mặc dù "cấu hình" trong trường hợp này không lớn

vì vậy, phiếu bầu của tôi sẽ (Nếu tôi có thể bỏ phiếu) cho những người đề xuất loại bỏ lỗi cú pháp trong các tệp YAML.

bây giờ ... để giải quyết lỗi, đối với tôi đó là một loại lỗi mới, tôi không có tệp ngôn ngữ mà tôi đã xác định là mặc định trong thư mục Config/application.rbcủa mìnhConfig/locales

mã hóa vui vẻ


1

Cần kiểm tra các tệp .yml để tìm lỗi, tôi đã tìm thấy sự cố trong cơ sở dữ liệu của mình.yml


1

Tôi gặp sự cố tương tự với tệp bản dịch YAML không đúng định dạng. Nó đã sử dụng một biến trước khi xác định nó. Điều sau là sai:

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

Nó phải được thay đổi thành:

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

Sau đó, nó bắt đầu hoạt động trở lại.


1

Trong trường hợp của tôi, có 2 vấn đề.

  1. Như đã đề cập bởi @stwienert, biểu diễn mảng là một vấn đề.
  2. Một điều nữa là, nếu một Chuỗi bắt đầu bằng% {var}, tôi nhận được một ngoại lệ Phân tích cú pháp. Tôi đã phải thay đổi các chuỗi cho phù hợp để tránh bắt đầu bằng% {var}

Ví dụ: nếu chuỗi là

%{user_name} welcome to %{application_name} - Điều này đã tạo ra một lỗi

Để khắc phục, tôi phải thay đổi nó thành

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

Hy vọng điều này sẽ giúp ai đó.

Trân trọng,

Shardul.


Bạn có thể chỉ đơn giản là thay đổi YAMLtập tin để đặt dấu ngoặc kép quanh chuỗi của bạn, vì vậy hello: %{user_name} welcome to %{application_name}trở nên hello: "%{user_name} welcome to %{application_name}"thay vì phải thay đổi bản án của bạn, đó là giỏ hàng đầu ngựa.
Dave Sag

1

Chà, chỉ trong trường hợp điều này giúp ích ...
Những gì tôi đã làm:
- chọn tất cả và sao chép từ https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml vào một es mới. yml với notepad ++
- đã cố gắng xem tệp mới này bằng trình soạn thảo văn bản netBeans IDE, tôi nhận được cảnh báo về tải an toàn với utf8 (không thể nhớ lại văn bản chính xác). Do đó không mở nó bằng trình soạn thảo văn bản này.
- đã chuyển cấu hình cục bộ qua cấu hình / application.rb i18n
- khi tôi tải trang irb, tôi nhận được "không thể phân tích cú pháp YAML ở dòng 0 cột 0" đề cập đến Psych.
- Đã đến IRB và tải tệp bằng syck, nó vẫn ổn; chuyển sang psych và gặp lỗi tương tự.

Tôi đã giải quyết như thế nào:
- quay lại sao chép nội dung từ https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml nhưng lần này tôi đã dán nó vào một tệp mới được tạo với biên tập viên netBeans.
- khởi động lại webRick.
- vấn đề đã được giải quyết.
Trân trọng,
Victor


1

Xóa cơ sở dữ liệu không sử dụng khỏi database.rb. Nếu bạn sử dụng MySQL và không có PostgreSQL thì hãy xóa mã cơ sở dữ liệu PG khỏi databases.yml.


1

Phân tích cú pháp Pshych là hấp dẫn đến cốt lõi. Tôi không chắc liệu đây có phải là giải pháp thanh lịch hay không nhưng tôi có thể khắc phục sự cố này bằng cách gỡ cài đặt nó.

gem uninstall psych

Điều này sẽ cho tôi những lỗi sau:gem "psych" cannot be uninstalled because it is a default gem
Paul Verschoor

1

Tôi đã có một vấn đề thực sự, thực sự kỳ lạ bởi vì tôi có khoảng trống sau đó. Ví dụ:

title: "NASA"

Không hoạt động, nhưng

title:"NASA"

Đã làm.


1

Nếu bạn giống tôi và phải đối mặt với một dự án (kế thừa) với hàng trăm đồ đạc, một vài dòng Ruby có thể giúp bạn tiết kiệm hàng giờ:

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

Chỉ cần đặt nó vào thư mục gốc Rails của bạn và chạy nó, hãy chuyển nó vào thùng rác khi bạn hoàn tất.


0

Đối với những người khác đang xem xét vấn đề này, tôi đã tìm thấy sự cố rerun.txtđang được gọi bởi config/cucumber.ymlứng dụng Rails.rerun.txtđược định cấu hình để lưu trữ bài kiểm tra thất bại dưa chuột gần đây nhất và bằng cách nào đó tôi đã nhập các ký tự kỳ lạ cho bài kiểm tra dưa chuột trong bảng điều khiển.

Điều đó thật khó để tìm thấy. Ước gì tôi đã thấy câu trả lời của Glenn Rempe một thời gian trước.


0

Một trong những nguyên nhân có thể là các giá trị ánh xạ không được phép trong ngữ cảnh này tại dòng ...

Đây là một ví dụ YAML không chính xác (người dùng: thực sự không nên chứa bất kỳ giá trị nào, vì nó chứa các mục con some_key và some_other_key)

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

Việc tìm ra vấn đề như vậy không phải là một nhiệm vụ tầm thường, đặc biệt nếu bạn có một tệp YAML lớn.

Tôi đã tạo một regexp khá đơn giản để phát hiện những thứ như vậy. Tôi đã kiểm tra nó trong RubyMine

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

Hãy cẩn thận! Nó không hoạt động chính xác với các ký tự đặc biệt như å ø æ, v.v.

Hãy cho tôi biết trong phần bình luận nếu nó phù hợp với bạn :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.