2017-05-10 8 views
0

나는 등, 특정 layout의 페이지가 YAML 검증해야합니다 있도록 빌드가 특정 필드가없는 경우 erroring과 더불어, 지킬 사이트에서 논리를 구축, 또는 값의 잘못된 유형을하고 싶은지정된 YAML 필드가없는 경우 Jekyll 빌드 중에 예외 발생?

한 가지 해결 방법은 단순히 오류 메시지를 받아 예외 발생시키는 액체 필터에 대한 미봉책 플러그인을 작성 통해 :

{% unless page.necessary_field %} 
    {{ "You're missing necessary_field" | raise_error }} 
{% endunless %} 
,536 : 템플릿 내에서, 그리고

module Jekyll 
    module ExceptionFilter 
    def raise_error(msg) 
     bad_file = @context.registers[:page]['path'] 
     err_msg = "On #{bad_file}: #{msg}" 
     raise err_msg 
    end 
    end 
end 

Liquid::Template.register_filter(Jekyll::ExceptionFilter) 

을, 예를 들어,이를 포함 할 수 있습니다

이런 종류의 작업이 완료됩니다.

하나의 문제는 빌드 프로세스가 하나의 오류를 찾으면 즉시 중단된다는 것입니다. 나는 repo의 모든 .md 파일을 통해 빌드를 계속하고 모든 페이지의 오류 목록을 수집하여 끝에 표시하는 것을 좋아합니다. Based on the Jekyll docs, 나는 _config.ymlliquid: error_mode: warn가 이럴 것이라고 생각했지만 그렇지 않았습니다.

답변

2

생성하기 전에 생성기를 사용하여 모든 파일을 검사 할 수 있습니다. 여기 당신이 그것을 할 수있는 방법은 다음과 같습니다

module MyModule 

    class WarningGenerator < Jekyll::Generator 
    def generate(site) 

     errors = Array.new 

     site.posts.docs.each do |p| 
     unless p.data['my_property'].any? { 
      errors = "On #{p.title}: My Property is missing" 

     } 
     end 

     errors.each do |error| 
     puts error 
     end 

     raise "There were errors" 
    end 
    end 
end 

주의,이 코드는 테스트되지 않은 상태입니다 :)

가 IT의 모든 페이지를 통해 걸을 것

이 특정 속성에 대한 검사, 배열에 메시지를 추가 의 경우 나중에 오류가 발생합니다.

+0

아, 예를 들어, 최종적으로 예외를 발생시키기 전에 모든 페이지에서 반복 할 수 있으므로 발전기가 더 이해할 수 있습니다. – mdlincoln

+0

템플릿/액체 필터 솔루션에서 얻게되는 이점 중 하나는 액체 마크 업을 통해 로직을 정의 할 수 있다는 것입니다. 이 사이트는 많은 기여자들에 의해 편집되었으며 필요에 따라 논리를 유지하고 변경할 수있는 액상 마크 업을 잘 알고 있지만 루비로 작성된 확장 내에서 규칙을 변경하고 확신을 가지지 않습니다. – mdlincoln

+1

물론. 그것은 모두 다릅니다 :-) – Christian