在发布我的脚本之前,我在 package.json 下有许多脚本来编译咖啡脚本、打字稿和仅限开发人员的命令 - 一旦发布就没有任何意义。
我想知道是否有删除 package.json 下某些脚本的程序?考虑到在发布包时,它也会发布 package.json。
在发布包之前是否可以删除脚本?
发布脚本后,我会删除许多 typescript 和 Coffeescript 源文件(因为它们已编译),因此我用于构建 no 的脚本对于已发布的包没有任何意义。
这可行吗?或者我应该考虑另一种方式?
简短的回答。
“在发布包之前是否可以删除脚本?”
npm 不包含从中删除脚本的内置功能package.json
.
长答案和解决方案。
“这样可行吗?还是我应该想想别的办法?”
有几个内置功能称为前钩和后钩 http://www.marcusoft.net/2015/08/pre-and-post-hooks-for-npm-scripting.html可以用来满足您的要求,尽管是以相当定制的方式。相关的钩子是prepublish
and postpublish
并在中描述文档 https://docs.npmjs.com/misc/scripts如下;
预发布:在包打包和发布之前运行,以及在本地运行npm install
没有任何争论...
发布后:在包发布后运行。
解决方案的概要是:
-
利用一个prepublish
您项目中的脚本package.json
调用自定义nodejs脚本。这nodejs脚本执行以下操作:
- 读了原著
package.json
数据并缓存它。
- 从中删除特定的脚本/键
scripts
的部分package.json
.
- 将修改后的数据写回原来的数据
package.json
.
-
利用一个postpublish
您项目中的脚本package.json
调用另一个自定义nodejs脚本。这个二级nodejs脚本执行以下操作:
代码示例/要点。
-
下列nodejs脚本将执行上面第一点中提到的任务。让我们命名它cleanse-pkg.js
.
clean-pkg.js
const fs = require('fs');
const path = require('path');
// Define absolute paths for original pkg and temporary pkg.
const ORIG_PKG_PATH = path.resolve(__dirname, '../package.json');
const CACHED_PKG_PATH = path.resolve(__dirname, '../../cached-package.json');
// Obtain original `package.json` contents.
const pkgData = require(ORIG_PKG_PATH);
if (process.argv.length <= 2) {
throw new Error('Missing npm scripts key/name argument(s)');
}
// Get list of arguments passed to script.
const scriptsToRemove = process.argv[2].split(',');
const devDepsToRemove = process.argv[3] ? process.argv[3].split(',') : [];
// Write/cache the original `package.json` data to `cached-package.json` file.
fs.writeFile(CACHED_PKG_PATH, JSON.stringify(pkgData), function (err) {
if (err) throw err;
});
// Remove the specified named scripts from the scripts section.
scriptsToRemove.forEach(function (scriptName) {
delete pkgData.scripts[scriptName];
});
// Remove the specified named pkgs from the devDependencies section.
devDepsToRemove.forEach(function (pkgName) {
delete pkgData.devDependencies[pkgName];
});
// Overwrite original `package.json` with new data (i.e. minus the specific data).
fs.writeFile(ORIG_PKG_PATH, JSON.stringify(pkgData, null, 2), function (err) {
if (err) throw err;
});
-
以下次要nodejs脚本将执行上面第二点提到的任务。我们来命名这个restore-pkg.js
.
恢复-pkg.js
const fs = require('fs');
const path = require('path');
// Define absolute paths for original pkg and temporary pkg.
const ORIG_PKG_PATH = path.resolve(__dirname, '../package.json');
const CACHED_PKG_PATH = path.resolve(__dirname, '../../cached-package.json');
// Obtain original/cached contents from `cached-package.json`.
const pkgData = JSON.stringify(require(CACHED_PKG_PATH), null, 2) + '\n';
// Write data from `cached-package.json` back to original `package.json`.
fs.writeFile(ORIG_PKG_PATH, pkgData, function (err) {
if (err) throw err;
});
// Delete the temporary `cached-package.json` file.
fs.unlink(CACHED_PKG_PATH, function (err) {
if (err) throw err;
});
实施和使用。
-
The prepublish
and postpublish
脚本在项目中定义package.json
如下:
人为的原始 package.json
{
...
"scripts": {
"keep": ... ,
"a": ... ,
"b": ... ,
"prepublish": "node .scripts/cleanse-pkg \"a,b,prepublish,postpublish\"",
"postpublish": "node .scripts/restore-pkg"
},
...
}
请注意\"a,b,prepublish,postpublish\"
部分于prepublish
脚本。这定义了要传递给的参数cleanse-pkg.js
(即它列出了发布前要删除的每个脚本的名称)。每个要删除的命名脚本必须是;作为单个字符串提供,用逗号分隔,并且不得包含空格。
Both cleanse-pkg.js
and restore-pkg.js
驻留在名为的隐藏文件夹中.scripts
,它本身位于项目目录的顶层,(即与项目处于同一级别package.json
). Both nodejs可以根据需要重新定位脚本,并根据需要在相应的脚本中重新定义它们的路径npm 脚本 .
-
鉴于人为的package.json
以上,实际package.json
最终发布的 tarball 的内容如下:
结果/发布的 package.json
{
...
"scripts": {
"keep": ...
},
...
}
devDependencies 部分中的包。
也许有列出的软件包devDependencies
您的项目的一部分package.json
您还希望在已发布的内容中删除该内容package.json
.
(注意: 中列出的任何软件包开发依赖 https://docs.npmjs.com/files/package.json#devdependencies不过,当用户通过 npm-registry 安装时,不会下载该部分).
但是,也许您还是想删除它们。如果这是一个要求,那么cleanse-pkg.js
还接受可选的第二个参数。该参数类似于第一个参数,即每个命名包要从devDependencies
部分必须是;作为单个字符串提供,用逗号分隔,并且不得包含空格。
-
我们假设原来的package.json
这次如下:
人为的原始 package.json
{
...
"scripts": {
"keep": ... ,
"a": ... ,
"b": ... ,
"prepublish": "node .scripts/cleanse-pkg \"a,b,prepublish,postpublish\" \"x,z\"",
"postpublish": "node .scripts/restore-pkg"
},
"devDependencies": {
"x": "^1.0.2",
"y": "^0.8.1",
"z": "^0.8.1"
},
...
}
- 注意额外的第二个
\"x,z\"
参数添加到prepublish
脚本来指定要从devDependecies
部分。
-
这次,考虑到人为的package.json
以上,实际package.json
最终发布的 tarball 的内容如下:
结果/发布的 package.json
{
...
"scripts": {
"keep": ...
},
"devDependencies": {
"y": "^0.8.1"
},
...
}
Running
该解决方案假设npm 发布 https://docs.npmjs.com/cli/publish将使用以下方法之一运行:
- 来自项目目录内,不带任何参数。例如。
npm publish
.
- 指定项目的路径
package.json
. E.g. npm publish path/to/package.json
.
通过提供包含单个文件夹的 gzip 压缩 tar 存档的 url 或文件路径是行不通的。package.json
里面的文件。
补充笔记
为了防止这两种效用nodejs脚本,(cleanse-pkg.js
and restore-pkg.js
),从发布开始,它们应该添加到您的项目中.npmignore https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package文件。鉴于上面解释的这两个文件的位置,您可以添加.scripts
进入.npmignore
.
-
两者都有实用性nodejs脚本,cleanse-pkg.js
and restore-pkg.js
, 定义:
- 原始路径的绝对路径
package.json
file.
- 临时路径的绝对路径
cached-package.json
文件应该被写入。目前,它保存在项目目录的上一级/外部,以避免被发布)。
如果您选择存储cleanse-pkg.js
and restore-pkg.js
到与上述位置不同的位置,以下代码片段中的路径将需要根据需要在两个文件中重新定义。
const ORIG_PKG_PATH = path.resolve(__dirname, '../package.json');
const CACHED_PKG_PATH = path.resolve(__dirname, '../../cached-package.json');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)