跨多种文件类型划分和填充多个变量?

时间:2015-11-20 21:40:26

标签: node.js unix npm

我正在为npm包生成器构建CLI,我希望在多个文件中找到/替换多种格式的多个变量。这包括这些文件的内容(思考,CSS,HTML,JS,Markdown等)

获取必要数据的方法可能有很多种组合。

为了降低可能性:

  1. 用户输入
  2. 环境变量
  3. ~/.npmrc中的值(不知道如何在任何地方引用这些内容)
  4. 基于1.或2的外部API调用。
  5. 你会如何建立这样的东西? 我已经查看了Yeoman generatorsExpress's generatornpm-init modules的来源,但我从来没有做过文件标题,内容和不同来源的内容。

    我很确定我会过度思考它,但请考虑这篇文章进行理智检查。

1 个答案:

答案 0 :(得分:1)

我们解决了我们在AdRoll上为我们的UI组件库使用的npm包生成器的类似问题,如here所述。

我们使用Yeoman作为我们的npm包/组件生成器。生成器由我们操作的一组样板文件组成,以便npm包具有正确的文件结构和内容。

我们使用用户输入来获取必要的数据。开发人员提供组件的名称,该名称将用于填充特定于组件的内容并根据需要重命名文件。

每个样板文件都是Yeoman模板文件(请参阅"复制模板文件"部分here)。我们在组件名称应该位于的每个文件中使用占位符。在重命名文件方面,您可以在模板文件处理后为其指定不同的destinationPath

所以说我们有一个名为ComponentName.jsx的组件模板文件,如下所示:

import React from 'react';
let <%= componentName %> = React.createClass({ /* component code goes here */ });
export default <%= componentName %>;

当我们复制模板文件并希望更改文件名时,我们将对Yeoman writeFiles步骤中的特定文件执行以下操作:

// - `path` here is the node path module
// - `this` is the Yeoman generator context
// - `file` is the file being operated on in the `writeFiles` Yeoman generation step
var projectRoot = '/project/root/',
    fileName = path.relative(projectRoot, file),
    fileExt = path.extname(fileName),
    outputPath = path.dirname(fileName);

var outputFile = outputPath + '/' + this.componentName + fileExt;

// write the file
this.fs.copyTpl(
    this.templatePath(fileName),
    this.destinationPath(outputFile),
    { componentName: this.componentName }
);