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

Posted

技术标签:

【中文标题】如何使用 package.json 脚本复制具有特定文件扩展名的文件【英文标题】:How to use package.json scripts to copy files with specific file extension 【发布时间】:2016-10-27 19:46:45 【问题描述】:

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

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

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

我尝试过使用带有过滤器的NCP,但我无法让过滤器工作。我已经测试了过滤器中使用的正则表达式,它似乎工作正常。测试在Regex Tester 使用正则表达式.*\.js$main.tsmain.jsmain.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 的脚本部分中仅将具有特定扩展名的文件复制到另一个文件夹?我很确定我忽略了一些非常明显的东西......

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

完美。现在我的脚本是“copy”:“cpx \”scripts/**/*.js\“wwwroot/scripts”,devDependency是“cpx”:“1.3.1”。这正是我想要的。 是的,cpx 是一个非常棒的工具。很好的推荐。 目前 cpx 似乎已被放弃,并且在依赖项中存在开放漏洞。我建议在cpy 的基础上使用cpy-cli。 我认为 ncp 可能是一个很好的替代品,因为 cpx 现在似乎被放弃了。它是异步的,可以进行递归文件和目录复制。 上一个版本是 3 年前。看起来它被遗弃了。它有漏洞【参考方案2】:

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

例如将所有*.css 文件从./src 文件夹复制到./styles 文件夹:

copyfiles --flat src/*.css styles

【讨论】:

为什么不只是cp -R?我正在使用cp -R ./email/templates ./build/email,只是对您的解决方案感到好奇。 @Woppi 我的理由是,因为它使用操作系统命令,这可能不适用于其他操作系统。 @Coo 我明白了。非常感谢您分享您的推理。欣赏它。【参考方案3】:

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

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

【讨论】:

这将移动而不是复制【参考方案4】:
@powershell copy \"D:/Path/untitled.txt\"  destionation-file.txt"

【讨论】:

package.json 文件意味着可以在节点支持的任何操作系统上运行的项目。 PowerShell 不支持所有相同的操作系统。 @JasonAller Powershell 可跨平台使用docs.microsoft.com/en-us/powershell/scripting/whats-new/… 编辑答案以包含该信息以及注意未安装 PowerShell 的系统将如何对这行代码做出反应以及是否有办法缓解这种情况会很有用。 【参考方案5】:

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”

更多信息here

【讨论】:

【参考方案6】:

您可以为此使用 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'))
);

【讨论】:

将 Gulp 添加为仅用于复制文件的依赖项有点过头了。如果您已经/仍在使用 gulp,它可能是一种选择。 是的,如果有人使用 webpack 之类的东西,他们不会想添加 gulp 来使用副本。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

我可以在我的脚本命令中使用 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.

【讨论】:

这不需要cp npm 包吗? 不能在 Windows 中工作?

以上是关于如何使用 package.json 脚本复制具有特定文件扩展名的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 postinstall 编辑 package.json

是否可以从 package.json 的目录之外运行 package.json 中定义的脚本?

如何使用 package.json 运行 ts 脚本?

如何从 package.json“脚本”执行 powershell ps1 脚本?

在 package.json 中使用 * 而不是版本号时如何始终获取最新版本? [复制]

package.json执行与量角器中的其他构建工具有什么不同以便执行?