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

问题描述 投票:0回答:10

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

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

我不想为每个文件制作复制语句,但想复制所有 .js 文件。另外,我的源文件夹包含也包含 javascript 文件的子文件夹。这些也需要复制,并维护子文件夹结构。

我尝试过将 NCP 与过滤器一起使用,但我无法使过滤器工作。我已经测试了过滤器中使用的正则表达式,它似乎工作正常。测试是在 Regex Tester 上使用正则表达式

.*\.js$
和测试字符串(如
main.ts
main.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 的脚本部分中仅将具有特定扩展名的文件复制到另一个文件夹?我很确定我忽略了一些显而易见的事情......

npm package.json build-tools
10个回答
101
投票

警告! cpx 软件包似乎已被放弃。 cpy-cli、copyfiles 和其他解决方案在此处的评论或下面的答案中列出。

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

它有一个 CLI,允许您使用 glob 而不是正则表达式,可以保留目录树,并且在我写这篇文章时相对最新......


46
投票

还有名为

copyfiles
的 npm 模块 https://github.com/calvinmetcalf/copyfiles

例如将所有

*.css
文件从
./src
文件夹复制到
./styles
文件夹:

copyfiles --flat src/*.css styles

13
投票

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

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

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

3
投票

Windows 用户:

// Copy file
xcopy c:\workfile d:\test

// Copy folders incl. sub folders
xcopy <source> <destination> /e

// If folder name has space in name use double quotes
xcopy c:\workfile “d:\test new”

更多信息这里


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'))
});

1
投票

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

所以你的正则表达式必须匹配所有这些路径和你的文件


0
投票

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

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

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

I use this in Git bash in windows which has the cp command available.  The comments are correct that you will need this in your underlying shell/command prompt.  It should be able to be modeled and updated for your OS.


0
投票

@KostovV answer 但适用于 json 字符串和相对路径

"build": "nest build && xcopy \".\\myFolder0\" \".\\myFolde1\\sub\"",


0
投票

我使用 shk 包它是 ShellJS Unix 命令的包装器。

安装 shk 作为 devDependency 并创建一个新的脚本任务:

"scripts": {
    "copy": "shx cp wwwroot/scripts/*.js ../destinationFolder" 
}
© www.soinside.com 2019 - 2024. All rights reserved.