【问题标题】:How do I process multiple files as templates with yeoman generator?如何使用 yeoman 生成器将多个文件作为模板处理?
【发布时间】:2013-11-22 07:16:54
【问题描述】:

我正在开发一个我最初使用 grunt-init 编写的自定义生成器。我注意到的一个区别是 grunt-init 自动将 root 中的所有文件作为模板处理,但使用 yeoman 生成器,您必须使用 .template() 来执行此操作。我熟悉如何使用 .template() 处理任何单个文件,但是否可以处理整个目录?

【问题讨论】:

    标签: gruntjs yeoman yeoman-generator grunt-init


    【解决方案1】:

    这个问题很烦人。我第一次使用 yeoman 时遇到了这个问题。我认为下面的代码 sn-p 可以帮助你。

    this.directory('scripts', 'scripts');// script is folder name
    

    【讨论】:

    • 这会将所有文件从一个目录批量复制到另一个目录,而不需要模板文件。
    • 至少在最近的 Yeoman 版本中,这是通过应用模板和冲突检查来工作的(还有另一个名为 bulkDirectory 的函数可以避免两者)。可悲的是,我找不到避免模板处理但保持冲突检查的方法。注意,如果source和dest相同可以跳过:this.directory('scripts')..从源学到:yeoman.github.io/generator/actions.js.html
    • @Diego 您提供的链接已失效。你能提供一个新的吗?
    • @SKuijers np 似乎 Yeoman 最近更新了文档站点,新链接:yeoman.github.io/generator/lib_actions_actions.js.html
    【解决方案2】:

    查看 Yeoman 生成器代码,似乎没有内置的方法来执行此操作。我解决这个问题的方法是从内置的生成器代码中复制一些代码并根据我的需要进行修改。我确定一个文件是否是基于 _ 前缀约定的模板,因为我想重命名文件以排除该前缀,但您可以将每个文件视为模板,它会正常工作。这将复制目录中的所有文件,所以我还做的是排除您在 OSX 上默认找到的 .DS_STORE 文件,但由于这是一个特定情况,因此我没有在此处包含该文件。

    require('path');
    
    MyGenerator.prototype._processDirectory = function(source, destination) {
        var root = this.isPathAbsolute(source) ? source : path.join(this.sourceRoot(), source);
        var files = this.expandFiles('**', { dot: true, cwd: root });
    
        for (var i = 0; i < files.length; i++) {
            var f = files[i];
            var src = path.join(root, f);
            if(path.basename(f).indexOf('_') == 0){
                var dest = path.join(destination, path.dirname(f), path.basename(f).replace(/^_/, ''));
                this.template(src, dest);
            }
            else{
                var dest = path.join(destination, f);
                this.copy(src, dest);
            }
        }
    };
    

    【讨论】:

      【解决方案3】:

      Yeoman 使用 mem-fs-editor,它支持 glob 模式。但是文档不是很清楚,您可能会错过这一点。这是copyTpl 的文档,表示它接受与copy 相同的选项。因此,既然 copy 支持 glob 模式,那么 copyTpl 也是如此。

      在你的 yeoman 生成器上的任何时候你都可以这样做:

          const from = 'myFolder/**.js'
          const to = 'project/'
          this
              .fs
              .copyTpl(
                   this.templatePath(from), 
                   this.destinationPath(to), 
                   this.props, {interpolate: /<%=([\s\S]+?)%>/g}
              );
      },
      

      不是这样,如果您使用的是 glob 模式,则目标路径应该是一个文件夹。

      【讨论】:

      • 我已经用最新版本的 Yeoman 进行了完全尝试,无论“项目”文件夹是否存在,它都不会复制任何内容。我什至将 globbing 模式扩展为 './**/*' 以尝试复制任何文件,但无论文件夹深度、文件名或扩展名如何,都没有任何结果。 globbing 似乎什么都不做。
      • 这适用于我当前的 yeoman 版本,谢谢。测试人员需要创建 myFolder 并将文件放入其中才能工作
      猜你喜欢
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2016-07-13
      • 1970-01-01
      • 2013-06-17
      相关资源
      最近更新 更多