npm脚本,打包时将package.json复制到dist目录

35

我正在尝试在我的npm捆绑脚本中添加第二部分。第一部分已经运行得很好,但是我想连同捆绑文件一起复制3个文件。

所以现在我的代码是:

"bundle": "NODE_ENV=production webpack --output-file bundledFile.js && cp package.json dist/",

NODE_ENV=production webpack --output-file bundledFile.js本身运行良好。目前出现问题的是&& cp package.json dist/,我想将package.json一起复制到dist文件夹中(实际上还有其他两个文件,但现在只从这一个开始)。对这些脚本很新,有什么建议怎样修复吗?感谢任何建议,谢谢!


2
在命令行中使用 cp 时要小心,因为它通常不兼容 Windows 用户(尽管这可能不是您关心的问题)。除此之外,我认为这看起来没问题。你应该能够使用 && 链接 package.json 脚本。你遇到了特定的错误吗?如果您将这两个项目作为两个单独的任务,然后链接它们会发生什么?(类似于 npm run build:bundle && npm run build:package-json)。 - dvlsg
@dvlsg感谢回复,除了cp你有其他推荐吗?另外我可以对多个单文件使用相同的语法吗(例如我想添加readme和npmrc)? - ajmajmajma
1
如果你正在复制多个文件,而webpack不支持你需要的功能(不确定),我建议添加一个构建实用程序文件。你不需要完全使用gulp或其他任何东西(尽管我喜欢gulp)-- 你只需创建一个名为copy-files.js的node文件,并使用fs包来复制文件。由于它使用node来处理复制文件,因此这将是(大多数)跨平台的。然后你可以在npm脚本中只使用node copy-files.js来调用它。你仍然必须假设node可用,但这并不太困难。 - dvlsg
@dvlsg 如果你想把这个作为答案添加进去,那就太完美了,这正是我所需要的。 - ajmajmajma
我可以将其添加为答案,但也许首先检查一下将命令拆分为两个任务(npm run build:bundlenpm run build:package-json)然后设置 build: npm run build:bundle && npm run build:package-json 是否适用于您。我仍然认为我们会遇到链接命令的问题,不管出于什么原因。 - dvlsg
1
@dvlsg 我添加了 && npm run copy,并且复制脚本看起来像这样:"cp package.json dist/ && cp README.md dist/ && cp .npmrc dist/",这似乎非常有效。 - ajmajmajma
5个回答

53

这个语法应该是有效的(根据您的评论看起来是这样)。不过我建议将npm脚本分成多个点:

{
  "bundle": "NODE_ENV=production webpack --output-file bundledFile.js",
  "copy": "cp package.json dist/ && cp README.md dist/ && cp .npmrc dist/",
  "build": "npm run bundle && npm run copy"
}

为了跨平台兼容性(cp 在 Windows 上通常不可用),我建议添加一个构建文件,例如 ./tools/copy-distrubution-files.js,它将利用 fs 复制必要的文件,然后在 npm 脚本中调用它,使用 node ./tools/copy-distribution-files.js。这将是(大多数)平台无关的(您仍然必须假设 node 可用作 nodejs 可执行文件,但对我来说似乎相当合理)。

1
@mardok 这取决于您是否拥有该实用程序。我在Windows上安装了Linux工具,cp命令可以使用。 - TheRealChx101
9
如果您想支持跨操作系统环境,请使用ncp而不是cp - Alex Klaus
1
CP可以在Windows上使用Git Bash,只需确保通过它运行命令即可 :) - Glen

7
我最快的方法是在 package.json 脚本中引用 PowerShell,如下所示:
"copyFile": "@powershell copy './source/package.json' './deploy'",

4
你救了我一命,让我不再自杀。 - AlwaysConfused

6

如果您正在使用Windows操作系统,请使用以下命令:

"copy": "copy \"package.json\" \"dist\" && copy \"README.md\" \"dist\" && copy \".npmrc\" \"dist\""

使用copy代替cp命令。

不要忘记为每个路径使用""(在引用的命令中用\转义它们)。如果需要定义长路径,请勿使用/(斜杠),而是使用\(反斜杠)。

例如:

copy "devices\\VS-88UT\\index.html" "devices\\VS-88UT\\dist"

此外,如果您喜欢,有一个很好的插件可以在每次构建之前和之后运行bash命令。插件名称为webpack-shell-plugin

2
这不是有效的 JSON。你能否清理引号,以便我可以轻松地将其粘贴到我的 package.json 文件中? - FirstVertex

2

使用Node

使用Node.js内置的功能,而不是依赖于并非每个操作系统都可用的shell命令,是正确的方法。因此,应避免本页面上的所有其他答案。

在当前的Node.js版本中,可以使用fs.copy来复制文件和文件夹。结合node -e "javascript code goes here",可以编写简短、跨平台的npm脚本。

"copyAssets": "node -e \"require('fs').cpSync('./assets', './build/assets', {recursive: true});\""

将会把 /assets 文件夹复制到 /build/assets 文件夹中。


0

在Windows中复制文件夹和文件只需使用以下命令:

xcopy git\\* dist\\ /e /i /h

我认为这可能会对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接