如何使用package.json脚本复制具有特定文件扩展名的文件

时间:2016-06-25 07:27:37

标签: npm package.json build-tools

我正在尝试将npm作为构建工具。

我遇到的一个绊脚石是我需要将javascript文件从一个文件夹复制到另一个文件夹。源文件夹包含打字稿文件,javascript文件和地图文件,但在目标文件夹中我只对javascript文件感兴趣。

我不想为每个文件创建一个copy-statement,但是想要复制所有.js文件。此外,我的源文件夹包含也包含javascript文件的子文件夹。这些也需要复制,并维护子文件夹结构。

我尝试过使用带有过滤器的NCP,但我无法使用过滤器。我已经测试了过滤器中使用的正则表达式,它似乎工作正常。测试在Regex Tester处使用正则表达式.*\.js$和测试字符串(如main.tsmain.js main.js.map等进行,并且仅匹配.js字符串。

我的包json包含以下(缩写):

{
    "scripts": {
        "copy": "ncp scripts wwwroot/scripts --filter=\".*(\\\\.js$)\"" 
    }, 
    "devDependencies": { 
        "ncp": "2.0.0.0" 
    }
}

由于我的正则表达式是字符串中的字符串,所以我对它进行了双重转义。我也尝试了其他变体,例如:

--filter=/.*\.js$/g       - compilation error
--filter=/.*\\.js$/g      - no files copied
--filter=\".*\\.js$\"     - no files copied
--filter=\"/.*\\.js$/g\"  - no files copied
(no filter)               - all files copied

我与NCP没有任何关系。如果其他东西效果更好,我会用它。

所以:我如何在package.json的脚本部分中仅将具有特定扩展名的文件复制到另一个文件夹?我很确定我忽略了一些非常明显的事情......

7 个答案:

答案 0 :(得分:64)

cpx可能是一个很好的替代品。

它有一个CLI,允许你使用globs而不是正则表达式,可以保存目录树,并且在我写这个时它是相对最新的....

答案 1 :(得分:10)

还有名为copyfiles的npm模块 https://github.com/calvinmetcalf/copyfiles

E.g。将所有*.css文件从./src文件夹复制到./styles文件夹:

copyfiles --flat src/*.css styles

答案 2 :(得分:5)

快速兼容性构建脚本(也适用于Windows):

"build": "react-scripts build && mv build docs || move build docs",

答案 3 :(得分:2)

@powershell copy \"D:/Path/untitled.txt\"  destionation-file.txt"

答案 4 :(得分:1)

你可以使用gulp.js。 编写gulp任务以仅隔离js文件(/path/to/files/*.js)并将其移动到您选择的目标位置。 它只需要几行代码。 如有必要,请在package.json的脚本部分中包含它。

gulp.js的链接:https://gulpjs.com/

var gulp = require('gulp');
gulp.task('jscopy', function(){
  return gulp.src('client/templates/*.js')
    .pipe(gulp.dest('build/js'))
});

答案 5 :(得分:0)

ncp递归复制,因此在复制文件之前,它将检查目录是否与过滤器匹配,例如:

d:\path\to\app\src\server
d:\path\to\app\src\server\middleware
d:\path\to\app\src\server\middleware\cool-middleware.js
d:\path\to\app\src\server\middleware\cool-middleware.js.map

因此您的正则表达式必须匹配所有这些路径,并且文件也必须匹配

答案 6 :(得分:0)

我可以在我的脚本命令中使用 cp:

"build": "npx babel src --out-dir dist && cp ./src/*.css ./dist",

如果您的分发包已经在 /dist 文件夹中,这将起作用。您还可以添加另一个命令来复制它,然后甚至运行发布命令。