ken*_*tor 4 npm typescript npm-scripts
使用案例:
我在 NPM 中设置一个prepublishOnly钩子,它删除“lib”文件夹,然后将打字稿源文件转换到新的 lib 文件夹中,然后运行测试。
问题:
应该有两个人发布 NPM 包,两人都在不同的操作系统(Windows / Mac)上工作。因此删除文件夹的命令是不同的。
"scripts": {
"build": "tsc",
"clean": "rm -rf lib",
"clean:windows": "if exist lib rmdir /s /q lib",
"lint": "tslint --project tsconfig.json --format stylish src/**/*.ts",
"format": "prettier --write \"**/*.ts\""
},
"husky": {
"hooks": {
"pre-push": "npm run clean:windows && npm run build && npm run test"
}
},
Run Code Online (Sandbox Code Playgroud)
问题:
有没有办法有条件地运行 NPM 脚本(基于所使用的操作系统),或者是否有可以跨这些操作系统运行的删除文件夹命令?
如果您只想通过 npm 脚本以跨平台的方式删除文件夹,则将gulp添加到工具列表中似乎没有必要。对于轻量级解决方案,请考虑以下两种解决方案:
\n\n看看rimraf,它的描述是:
\n\n\n\n\n\n
rm -rf节点的UNIX 命令。
用法
\n\ncd到您的项目目录并运行以下命令:
npm install rimraf --save-dev\nRun Code Online (Sandbox Code Playgroud)clean将您的脚本更改package.json为以下内容:
"scripts": {\n "clean": "rimraf lib",\n ...\n},\nRun Code Online (Sandbox Code Playgroud)clean:windows从您的脚本中删除该脚本package.json,因为它现在是多余的。
注意,当我将其安装为本地依赖项时,我并没有取得很大的成功,因此我使用下面的解决方案二。然而,您可能会取得更大的成功 - 所以值得一试。
\n\n以下解决方案使用的shelljs rm命令类似于 Unixrm -rf命令,但它用于节点 - 因此它是跨平台的等效命令。
以下步骤展示了如何实现这一点:
\n\ncd到您的项目目录并通过运行以下命令安装shelljs :
npm install shelljs --save-dev\nRun Code Online (Sandbox Code Playgroud)创建自定义节点脚本如下,我们命名该文件clean.js:
const shell = require(\'shelljs\');\n\nprocess.argv.slice(2).forEach(function(_path) {\n shell.rm(\'-rf\', _path);\n});\nRun Code Online (Sandbox Code Playgroud)\n\n.scripts并将其保存到项目根目录中名为的隐藏目录中。例如:
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 clean.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\nRun Code Online (Sandbox Code Playgroud)clean将您的脚本替换package.json为以下内容:
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 clean.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\nRun Code Online (Sandbox Code Playgroud)\n\n您还可以将多个路径参数传递给clean.jstoo。例如:
"scripts": {\n "clean": "node .scripts/clean lib",\n ...\n},\nRun Code Online (Sandbox Code Playgroud)\n\n文件路径也被处理。例如:
\n\n"scripts": {\n "clean": "node .scripts/clean lib another/folder/path foo/bar",\n ...\n},\nRun Code Online (Sandbox Code Playgroud)clean:windows从您的脚本中删除该脚本package.json,因为它现在是多余的。
笔记
\n\nclean.js利用内置的节点来process.argv获取调用脚本时传递给 Node 的命令行参数数组。
然后我们对索引中的参数数组进行切片()2,以确保我们只包含文件夹/文件路径参数(例如lib)。
最后,我们使用 循环遍历数组中的每个文件夹路径forEach(),并在循环的每一轮中调用shell.rm(\'-rf\', _path);以删除资产。
另一种跨平台解决方案(最初发布此答案时不可用)是利用shx包,其描述为:
\n\n\n\n\n\n
shx是ShellJS Unix 命令的包装器,为 npm 包脚本中的简单类 Unix、跨平台命令提供简单的解决方案
运行以下命令进行安装shx:
"scripts": {\n "clean": "node .scripts/clean path/to/quux.js",\n ...\n},\nRun Code Online (Sandbox Code Playgroud)然后重新定义您的clean脚本,package.json如下所示:
npm i -D shx\nRun Code Online (Sandbox Code Playgroud)