在yeoman生成器中获取项目基本路径

时间:2015-09-08 13:37:54

标签: yeoman yeoman-generator

我已将自动生成器依赖关系从0.18.10更新为0.20.3。 我已将已弃用的this.dest更新为this.destinationRoot()

在获取项目的基本路径时,我现在遇到了生成器问题,因此我可以将文件从一个位置复制到另一个位置。 我创建了一个将路径放在一起的函数,然后传递给另一个函数,该函数排除了一些文件被复制过来。

这是我用

获取错误的函数
// Copy Bower files to another directory
var copyBowerFiles = function (component, to, exclude) {
  var base = this.destinationRoot(),
      publicDir = base + '/' + this.publicDir,
      publicAssetsDir = publicDir + '/assets',
      bowerComponentsDir = publicAssetsDir + '/bower_components',
      bower,
      from;

  to = (base + '/' + to || publicAssetsDir);
  from = bowerComponentsDir + '/' + component;

  //this.dest.copy(from, to);
  this.bulkDirectory(from, copyDestPathPartial.call(this, to, exclude));
};

在最后一个函数中调用它:

end: function () {
    this.installDependencies({
        callback: function () {
            copyBowerFiles.call('jam', this.publicDir, excludeJamFiles);
        }.bind(this)
    });
}

我收到错误消息:

var base = this.destinationRoot(),
                ^
TypeError: undefined is not a function

我也尝试过sourceRoot()

我想更新我的生成器以使用最新版本的生成器。任何帮助实现这项工作都会很棒。

在调用函数时,你还需要传递this作为第一个参数吗?

修改 这是copyDestPathPartial函数

// Copy destination path partial
var copyDestPathPartial = function (to, exclude) {
  exclude = exclude || [];

  return function (abs, root, sub, file) {
    if (!_.contains(exclude, file) && ! _.contains(exclude, sub)) {
      this.copy(abs, to + '/' + (sub || '') + '/' + file);
    }
  }.bind(this.destinationRoot());
};

当我在copyBowerFiles函数中使用this时,我收到另一条错误消息,当我调用此函数时会显示:

throw new TypeError('Arguments to path.resolve must be strings');

copyDestPathPartial函数是否未输出字符串?

1 个答案:

答案 0 :(得分:0)

这只是一个JavaScript错误,120.9内的this不是您认为的。

根据您编写的代码,copyBowerFiles等于this

所以在这里你需要:jam。因为要调用的第一个参数是copyBowerFiles.call(this, 'jam', this.publicDir, excludeJamFiles);值。请参阅文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

话虽如此,分配随机this值非常脏并且难以维护。为什么不将this作为原型方法?