我正在为npm包生成器构建CLI,我希望在多个文件中找到/替换多种格式的多个变量。这包括这些文件的内容(思考,CSS,HTML,JS,Markdown等)
获取必要数据的方法可能有很多种组合。
为了降低可能性:
~/.npmrc
中的值(不知道如何在任何地方引用这些内容)你会如何建立这样的东西?
我已经查看了Yeoman generators,Express's generator,npm-init
modules的来源,但我从来没有做过文件标题,内容和不同来源的内容。
我很确定我会过度思考它,但请考虑这篇文章进行理智检查。
答案 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 }
);