Что не так с этим сценарием сборки на месте?

Я пытаюсь использовать metalsmith-in-place для создания шаблонов на месте для файлов в подкаталогах моего исходного каталога. Это не работает. Теги шаблона не заменяются вступительной частью.

Мой скрипт сборки:

var Metalsmith = require('metalsmith'),
  inplace = require('metalsmith-in-place'),
  nunjucks = require('nunjucks');

Metalsmith(__dirname)
  .source('./source')
  .use(inplace({
    engine: 'nunjucks',
    pattern: '*.html',
    directory: 'source/deeper'
  }))
  .destination('./build')
  .build(function(err) {
    if (err) {
      console.log(err);
    }
    else {
      console.info('Built it.');
    }
  });

Мой шаблон:

metalsmith_debug$ cat source/deeper/index.html
---
title: My pets
---

{{title}}

Мой вывод:

metalsmith_debug$ cat build/deeper/index.html

{{title}}

Он работает с файлами в source; но мне нужно, чтобы он работал с подкаталогами.


person hoosteeno    schedule 07.04.2016    source источник


Ответы (3)


Пара изменений: build.js:

var Metalsmith = require('metalsmith');
var inplace = require('metalsmith-in-place');
// var nunjucks = require('nunjucks');

Metalsmith(__dirname)
.source('./source')
.use(inplace({
    engine: 'nunjucks',
    pattern: '**/*.html' // modified pattern
    // directory: 'source/deeper' // Not needed
}))
.destination('./build')
.build(function(err) {
    if (err) {
        console.log(err);
    }
    else {
        console.info('Built it.');
    }
});
  1. Вам не нужно требовать nunjucks в файле сборки, metalsmith-in-place использует consolidate, это потребуется там, где это необходимо. (строку можно удалить)
  2. Измените pattern в пределах inplace на **/*.html. Дополнительные сведения см. в разделе шаблоны подстановки.
  3. directory не требуется в пределах inplace. (строку можно удалить)

... и небольшое изменение в source/deeper/index.html:

---
title: My pets
---

{{ title }}
  1. Добавлено пространство вокруг заполнителя {{ title }} - Nunjucks, кажется, считает это важным.

Должно работать сейчас для вас, дайте мне знать, если нет.

person Woody    schedule 08.04.2016

Принятый ответ устарел, потому что metalsmith-in-place переключился на использование фреймворка jstransformer вместо consolidate.

Я написал статью о том, как использовать плагин in-place для сопряжения Nunjucks с Metalsmith:

Вот минимизированный рабочий пример:

const Metalsmith = require('metalsmith');
const inPlace = require('metalsmith-in-place');

Metalsmith(__dirname)
  .source('./src')
  .destination('./build')
  .use(inPlace({
    pattern: '**/*.njk',
    engineOptions: {
      path: __dirname + '/src'
    }
  }))
  .build(function (error) {
    if (error) {
      throw error;
    }
  })
;
person Slava Fomin II    schedule 18.11.2017

Ваш pattern в конфигурации inplace, скорее всего, должен быть **/*.html, а не просто *.html

person erictgrubaugh    schedule 08.04.2016
comment
Я думал, что это может сработать, но на самом деле это вызывает ошибку шаблона при сборке. В настоящее время *.html получает все дерево каталогов (поэтому, если я устанавливаю каталог в качестве источника, я получаю материал в источнике/глубже). Но содержимое подкаталогов не обрабатывается. Так что, похоже, проблема не в пути? - person hoosteeno; 08.04.2016
comment
Просто следуя моему предыдущему комментарию: ошибка шаблона, которую я видел, была связана с неправильным HTML-кодом в исходном дереве. +1 за этот ответ, который был частичным, но правильным. - person hoosteeno; 08.04.2016