使用案例
我在NPM中设置ActiveRecord::Result
挂钩,删除“lib”文件夹,然后将打字稿源文件转换为新的lib文件夹,然后运行测试。
问题:
两个人应该发布NPM包,两者都在不同的操作系统(Windows / Mac)上工作。因此,删除文件夹的命令是不同的。
prepublishOnly
问题:
有没有办法有条件地运行NPM脚本(基于使用的操作系统),或者是否有一个可以在这些操作系统上运行的删除文件夹命令?
答案 0 :(得分:3)
如果您只想通过跨平台方式通过npm脚本删除文件夹,那么将 gulp 添加到您的工具列表似乎是不必要的。对于轻量级解决方案,请考虑以下两种解决方案:
看看rimraf,它被描述为:
节点的UNIX命令
rm -rf
。
<强>用法强>
cd
到项目目录并运行以下命令:
npm install rimraf --save-dev
将clean
中的package.json
脚本更改为以下内容:
"scripts": {
"clean": "rimraf lib",
...
},
从clean:windows
删除package.json
脚本,因为它现在是多余的。
注意在将其作为本地依赖项安装时,我没有取得很大的成功,因此我使用下面的解决方案二。但是你可能会取得更大的成功 - 所以值得一试。
以下解决方案使用shelljs
rm
命令,该命令类似于Unix rm -rf
命令,除了它用于节点 - 因此它是跨平台的等效命令。
以下步骤说明了如何实现这一目标:
cd
到项目目录并运行以下命令安装shelljs:
npm install shelljs --save-dev
按如下方式创建自定义节点脚本,让我们将文件命名为clean.js
:
const shell = require('shelljs');
process.argv.slice(2).forEach(function(_path) {
shell.rm('-rf', _path);
});
并将其保存到项目根目录中名为.scripts
的隐藏目录中。例如:
.
├── .scripts
│ └── clean.js
├── lib
│ └── ...
├── node_modules
│ └── ...
├── package.json
├── src
│ └── ...
└── ...
将clean
中的package.json
脚本替换为以下内容:
"scripts": {
"clean": "node .scripts/clean lib",
...
},
您也可以将多个路径参数传递给clean.js
。例如:
"scripts": {
"clean": "node .scripts/clean lib another/folder/path foo/bar",
...
},
也处理文件路径。例如:
"scripts": {
"clean": "node .scripts/clean path/to/quux.js",
...
},
从clean:windows
删除package.json
脚本,因为它现在是多余的。
备注强>
clean.js
利用内置process.argv
的节点获取调用脚本时传递给Node的命令行参数数组。
然后我们slice()来自索引2
的参数数组,以确保我们只包含文件夹/文件路径参数(例如lib
)。
最后,我们使用forEach()
遍历数组中的每个文件夹路径,并在循环的每个回合中调用shell.rm('-rf', _path);
以删除资产。
答案 1 :(得分:1)
我解决这类问题的方法是使用gulp
来定义一组特定于操作系统的任务,因为你在那里编写的代码与操作系统无关。
您需要安装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
。
(确保gulpfile中使用的包在package.json中作为dev-dependency安装!)
代码未经测试并写在我的头顶,但它只是为了给你一个大致的想法。