用例:
我正在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"
}
},
问题:
是否有一种有条件地运行NPM脚本的方法(基于使用的操作系统),或者是否有一个在这些操作系统上工作的remove文件夹命令?
发布于 2018-04-27 03:47:28
如果您只想通过跨平台方式通过npm脚本删除文件夹,那么将gulp添加到工具列表中似乎是没有必要的。对于轻量级解决方案,请考虑以下两种解决方案:
解决方案1
看看里姆拉夫,它被描述为:
UNIX命令
rm -rf
用于节点。
使用
cd
到您的项目目录并运行以下命令:
npm安装rimraf -save-devclean
脚本在package.json
中更改为:
“脚本”:{“干净”:"rimraf lib",. }clean:windows
中删除package.json
脚本,因为这是多余的。Note我在将它作为本地依赖项安装时并没有取得很大的成功,因此我使用了下面的解决方案2。然而,你可能会有更大的成功,所以值得一试。
解决方案2
下面的解决方案使用了shelljs
rm
命令,它类似于Unix rm -rf
命令,但它是用于节点的-因此它是一个跨平台的等价物。
以下步骤说明了如何实现这一目标:
cd
到您的项目目录,并通过运行以下命令安装贝壳类:
npm安装shelljs --保存-devclean.js
:
Process.argv.slice(2).forEach(函数(_path){ shell.rm('-rf',_path);})
并将其保存到项目根目录中名为.scripts
的隐藏目录中。例如:
。采购产品名称:.scripts clean.js│└──└──├──lib│.scripts└──...├──└──...├──node_modules│src└──...├──└──...├──├──src│src└──...└──.clean
脚本在package.json
中替换为:
“脚本”:{“干净”:“节点.脚本/清洁库”,
您还可以向clean.js
传递多个路径参数。例如:
“脚本”:{“干净”:“节点.脚本/清洁库另一个/文件夹/路径foo/bar",
文件也会被处理。例如:
“脚本”:{“干净”:“节点.脚本/清洁路径/to/quux.js”,. },clean:windows
中删除package.json
脚本,因为这是多余的。Notes
clean.js
利用节点内置的process.argv
来获得调用脚本时传递给Node的命令行参数数组。2
,以确保只包含文件夹/文件路径参数(例如lib
)。forEach()
循环遍历数组中的每个文件夹路径,并在循环的每一轮调用shell.rm('-rf', _path);
来删除资产。编辑/更新:
另一种跨平台解决方案(最初发布此答案时不可用)是利用沙克斯包,它被描述为:
shx
是围绕ShellJS Unix命令的包装器,它为npm包脚本中简单的类Unix跨平台命令提供了一个简单的解决方案。
shx
:
npm i -D shxclean
脚本重新定义为package.json
,如下所示:
“脚本”:{“干净”:"shx -rf lib“}发布于 2018-04-26 23:35:57
我解决这种问题的方法是使用gulp
来定义一组OS特定的任务,因为您编写的代码与操作系统无关。
您需要将gulp作为依赖项来安装,并在根目录中创建一个gulpfile.js
。在其中,定义要删除文件夹的任务。
var gulp = require('gulp'),
path = require('path'),
fs = require('fs-extra');
const rootFolder = path.join(__dirname);
const libFolder = path.join(rootFolder, 'lib');
gulp.task('clean:lib', function () {
return deleteFolder(libFolder);
});
function deleteFolder(folder) {
return fs.removeSync(folder);
}
gulp.task('deleteLib', ['clean:lib']);
然后,在您的package.json
脚本中,您可以执行&& gulp deleteLib
。(确保您的dev文件中使用的包是作为开发依赖项安装在package.json中的!)
代码是未经测试和写在我的顶部,但它只是给你一个大致的想法。
https://stackoverflow.com/questions/50057368
复制