Субгенератор Yeoman не может прочитать свойство toString со значением null

Я создаю генератор Yeoman, который до этого момента работал правильно. Мой index.js правильно работает в папке моего приложения, создавая начальную структуру. В этом файле я часто использую this.fs.copy() и this.fs.copyTpl(), и оба работают нормально. Сейчас я нахожусь в процессе создания подгенератора, который расширяет yeoman.generators.NamedBase в соответствии с требованиями документации здесь.

Моя файловая структура кажется правильной в соответствии с документацией на той же странице, на которую я ссылался выше. Это примерно так:

├───package.json
├───app/
│   └───index.js
└───view/
    └───index.js
    └───templates/
        └───views/
            └───view.html

Вот код, который я пытаюсь использовать для создания этого нового «представления» в моем проекте, расположенного в index.js в каталоге представления.

'use strict';
var yeoman = require('yeoman-generator');

module.exports = yeoman.generators.NamedBase.extend({
    copyFile: function() {

        this.fs.copyTpl(
            'views/view.html',
            'app/views/'+this.name.toLowerCase()+'.html',
            { name: this.name.toLowerCase() }
        );
    }
});

Я запустил yo {generatorname}:view helloWorld, ожидая, что он создаст новый файл на основе шаблона view.html, который представляет собой следующий файл, очень просто:

<p>This is the <%= name %> view.</p>

Когда я запустил эту команду, я получил следующую ошибку.

events.js:85
  throw er; // Unhandled 'error' event
        ^
TypeError: Cannot read property 'toString' of null
    at copy.process (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy-tpl.js:11:33)
    at applyProcessingFunc (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:12:16)
    at EditionInterface.exports._copySingle (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:52:24)
    at EditionInterface.exports.copy (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:22:17)
    at EditionInterface.module.exports [as copyTpl] (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy-tpl.js:9:8)
    at module.exports.yeoman.generators.NamedBase.extend.copyFile (/Users/woodruffjb/dev/yeoman/{generatorname}/view/index.js:7:11)
    at /Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/lib/base.js:408:16
    at processImmediate [as _immediateCallback] (timers.js:358:17)

Я попытался выяснить, была ли проблема в том, что this.name было неопределенным или нулевым, но когда я сделал console.log(this.name), я получил правильный ответ, который был helloWorld. После долгих поисков в Google единственный материал, который я смог найти по этой ошибке, касается других вещей, совершенно не связанных с тем, что я пытаюсь сделать, включая пакеты Atom и серверный код Node.js.

Все, о чем я могу думать, это то, что я как-то неправильно использую this.fs.copyTpl()? Тем не менее, я использую его точно так же, как я использую его в моем файле app/index.js для первоначальной настройки проекта. После всех моих поисков я застрял с этой проблемой. Согласно документации по этой функции, расположенной здесь, мне кажется делать это правильно. Кто-нибудь знает мою ошибку?


person John Woodruff    schedule 03.03.2015    source источник


Ответы (1)


Скорее всего, 'views/view.html' не найден на диске.

Это потому, что все this.fs методы не будут волшебным образом разрешать ваши пути. Безопасный способ - всегда указывать абсолютный путь. В вашем случае вы хотите скопировать файл, расположенный в каталоге вашего шаблона, поэтому вы будете использовать this.templatePath('views/view.html'), чтобы получить абсолютный путь к нему.

person Simon Boudrias    schedule 05.03.2015