Почему условные включают прекращение работы в Jekyll, если я не добавлю небелые пробелы?
Мой сайт, основанный на Jekyll, внезапно остановился, включая блок Google Analytics script. Вчера он работал (блок script был на всех страницах), но сегодня, после того как я загрузил новое сообщение, блок script был равномерно удален со всех страниц.
Я размещаю свой сайт на страницах GitHub, поэтому для устранения неполадок я хотел воспроизвести проблему на своей локальной машине. Оказалось, что я запускал старые версии Ruby и Jekyll на своей локальной машине, поэтому я обновил Ruby и установил GitHub Pages Gem, чтобы обеспечить, чтобы моя локальная среда согласованные страницы GitHub:
gem install github-pages
Это позволило мне воспроизвести проблему. Теперь, даже когда я бежал
jekyll serve --safe
блок Analytics script не был включен ни на одну страницу.
После значительного устранения неполадок я, наконец, понял, что если я помещу символ небелого пробела в файл JB/analytics, между аргументом google и директивой include, он работал.
Таким образом, работает, в том смысле, что когда переключатель --safe
включен, блок script в JB/analytics-providers/google
включен:
{% case site.JB.analytics.provider %}
{% when "google" %}.
{% include JB/analytics-providers/google %}
(обратите внимание на символ периода после {% when "google" %}
).
Однако это не работает - даже с помощью переключателя --safe
содержимое include JB/analytics-providers/google
никогда не включается:
{% case site.JB.analytics.provider %}
{% when "google" %}
{% include JB/analytics-providers/google %}
В то время как у меня есть обходной путь, я очень благодарен за объяснение этого поведения.
Ответы
Ответ 1
Это действительно проблема с жидкостью. Но я не могу воспроизвести его с версией жидкости, текущей для github-страниц, 2.5.5...
воспроизводящего
Это то, что я пробовал в сеансе pry:
# Load liquid 2.5.5
require 'liquid'
# Set up local file system to allow for includes
Liquid::Template.file_system = Liquid::LocalFileSystem.new( './' )
# Create template string
c = "{% case provider %}\n {% when 'google' %}\n {% include 'test' %}\n{% else %}\n else\n{% endcase %}"
# Create template
t = Liquid::Template.parse c
# Render
t.render( { 'provider' => 'google' } )
Независимо от того, использовал ли строки окончание строки \n
или \r\n
, я получаю ожидаемое поведение (=> "\n Liquid error: No such template 'test'\n"
в этом случае, так как у меня не было шаблона, но он вызывает include так...).
Предоставление любого другого значения, чем 'google'
, вызывает событие else и приводит к => "\n else\n"
.
Добавление периода влияет только на результат, включая точку, а не если оно вызывает включение или нет.
Followup
Не могли бы вы проверить свои версии? gem list liquid
и gem list jekyll
Не могли бы вы скопировать свой сайт и разделить его на минимальный пример для нас? Трудно воспроизвести то, что вы получили с предоставленной информацией.
Примечание для экспериментаторов
При выполнении Liquid в консоли или из тестового файла помните, что ему нравится, что хеши являются строками, а не символами. Подача { provider: 'google' }
для вывода результатов в => ""
... Она не найдет ваши ключи, если они не являются строками.