有没有办法将package.json
(在File
字段中)的文件包含到文件夹中,以便将它们与npm publish
打包在一起?
我的回购:
.
├── package.json
└── folder0
├── file0
└── folder1
└── file1
我的package.json:
{
"name": "example",
"version": "0.2.0",
"files": [
"folder0/file0",
"folder0/folder1/file1"
],
"author": "cruiz"
}
期望的输出:
我想要我的包裹:
.
├── package.json
└── build
├── file0
└── file1
非常感谢您的回复。我试图使用npm来打包VHDL代码,所以我真的很棒:(
是否可以将文件打包在package.json的字段中并从脚本中读取它们?
{
"name": "example",
"version": "0.2.0",
"customField": [
"folder0/file0",
"folder0/folder1/file1"
],
"scripts": {
"prepublishOnly": "mkdirp build && copyfiles -f [..read CustomField...] build"
},
"author": "cruiz"
}
答案 0 :(得分:0)
你基本上想要的是构建步骤。您可以在{
"scripts": {
"prepublish": "mkdir -p build && cp folder0/file0 folder0/folder1/file1 build"
}
}
脚本中执行所有这些操作,例如:
<强>的package.json 强>
files
但您也应该更改build
,除非您真的想要两个结构,folder0/*
和session
。
答案 1 :(得分:0)
根据OP的编辑进行编辑。
是否可以将文件打包在
package.json
字段中并从脚本中读取它们。
是的,这是可能的,但是您需要使用自定义节点脚本来执行此操作。我知道没有可用于实现此目的的现有软件包。
<强>解决方案:强>
首先,cd
到您的项目目录并卸载我在原始答案中提到的软件包,因为我们不会使用它们。您可以通过运行以下命令来执行此操作:
npm un -D mkdirp copyfile
使用以下命令安装shelljs:
npm i -D shelljs
注意:shelljs
现在将使用mkdirp
和copyfile
来创建目录,然后复制package.json
中列出的文件。
接下来创建一个包含以下内容的节点脚本。让我们将文件命名为copy-files.js
并将其保存到项目目录顶层名为.scripts
的隐藏目录中。即。
目录结构
project
├── .scripts
│ └── copy-files.js
├── node_modules
│ └── ...
├── package.json
├── folder0
│ ├── file0.js
│ └── folder1
│ └── file1.js
└── ...
copy-files.js
const shell = require('shelljs');
const pkg = require('../package.json');
// The path to the directory to copy the file(s) to.
const DEST_DIR = './build';
// NOTE: `customField` below should be replaced with the
// actual key name in the final `package.json`.
const srcFilePaths = pkg.customField;
// Create a new destination directory and intermediate
// directories if necessary.
if (!shell.test('-d', DEST_DIR)) {
shell.mkdir('-p', DEST_DIR);
}
// Recursively copy each file listed in the `customField` Array.
// Logs and error if the file listed cannot be found.
srcFilePaths.forEach(function (srcPath) {
if (!shell.test('-e', srcPath)) {
shell.echo('Error: Cannot find file listed in package.json: %s', srcPath);
process.exit(1);
}
shell.cp(srcPath, DEST_DIR);
});
注意:customField
中的const srcFilePaths = pkg.customField;
部分(上面copy-files.js
的第9行)需要替换为实际的真实密钥名称您决定使用最终package.json
。
最后,更新您的prepublishOnly
脚本以调用自定义节点脚本(即copy-file.js
),如以下package.json
摘录所示:
{
...
"customField": [
"folder0/file0.js",
"folder0/folder1/file1.js"
],
"scripts": {
"prepublishOnly": "node .scripts/copy-files",
},
...
}
这可以通过在package.json
文件中使用自定义npm-script来实现。如上所述,使用pre
脚本也符合您的要求:
将它们与
打包在一起npm publish
pre
和post
挂钩与npm脚本:所有npm脚本都支持所谓的pre
和post
挂钩。任何pre
脚本将在其各自的脚本(或命令)之前运行,并且任何post
脚本将在其各自的脚本(或命令)之后运行。
为了更好地理解这个功能,我们可以说我们的package.json
包含以下摘录中显示的人为脚本:
...
"scripts": {
"prefoo": "...",
"foo": "...",
"postfoo": "..."
},
...
如你所见:
foo
的脚本,其中包含带有pre
前缀的相应脚本,即prefoo
。foo
脚本也有另一个相应的脚本,但是这个脚本的前缀是post
,即postfoo
。只要通过运行foo
通过CLI调用npm run foo
脚本,以这种方式指定脚本将导致以下内容:
prefoo
脚本将在执行foo
脚本之前自动运行。postfoo
将在foo
完成后自动运行。可以找到有关pre
和post
挂钩的更多信息here
pre
脚本?有几个内置的pre
脚本可能符合您的要求;那些是prepublish
或prepublishOnly
。 npm docs为这些钩子提供了以下描述:
预发布:在打包和发布包之前运行,在没有任何参数的本地
npm install
上运行。 (见下文)
prepublishOnly :在准备和打包包之前运行,仅在
npm publish
...
注意:以下解决方案使用prepublishOnly
,因为我确信您不希望在用户运行npm install
时运行此脚本。但是,您需要决定是使用它还是将其交换为prepublish
。有关每个pre
挂钩的详细信息,请参阅docs。
对于适用于跨平台的解决方案,您首先需要cd
到项目目录并安装几个额外的npm包。
在scripts
文件的package.json
部分添加以下内容:
...
"scripts": {
"prepublishOnly": "mkdirp build && copyfiles -f folder0/file0.js folder0/folder1/file1.js build"
},
...
现在你跑步的时候; npm run publish
,prepublishOnly
脚本将自动运行(即复制文件以满足您所需的目录结构),然后准备好包并打包发布。
你当然可以跑; npm run prepublishOnly
,如果您想在运行之前测试脚本的结果:npm run publish
。