npm发布 - 从package.json中删除脚本?

时间:2018-02-15 07:46:05

标签: npm package.json npm-publish

在发布我的脚本之前,我在package.json下面有许多脚本来编译coffeescript,typescript和developer only命令 - 这些命令一旦发布就毫无意义。

我想知道是否有一个删除package.json下某些脚本的程序?考虑到在发布包时,它还会发布package.json。

在发布包之前是否可以删除脚本?

一旦我发布了我的脚本,我删除了很多打字稿和coffeescript源文件(因为它们已被编译),因此我用于构建no的脚本对于已发布的包没有任何意义。

这可行吗?或者我应该考虑另一种方式?

2 个答案:

答案 0 :(得分:4)

简短回答。

  

"在发布包之前是否可以删除脚本?"

npm不包含从package.json删除脚本的内置功能。<​​/ p>

解决方案的长期答案。

  

&#34;这可行吗?或者我应该考虑另一种方式?&#34;

有一些称为Pre and Post hooks的内置功能可用于满足您的要求,尽管是以相当自定义的方式。相关的钩子是prepublishpostpublish,并在documentation中描述如下;

  

预发布:在打包并发布包之前运行,以及在没有任何参数的本地npm install上运行...

     

postpublish :在发布包之后运行。

解决方案的概要是:

  1. 在项目prepublish中使用package.json脚本来调用自定义 nodejs 脚本。此 nodejs 脚本执行以下操作:

    • 读取原始package.json数据并对其进行缓存。
    • scripts的{​​{1}}部分删除特定的脚本/密钥。
    • 将修改后的数据写回原始package.json
  2. 在项目package.json中使用postpublish脚本来调用另一个自定义 nodejs 脚本。此辅助 nodejs 脚本执行以下操作:

    • package.json的内容恢复为原始状态。
  3. 代码示例/要点。

    1. 以下 nodejs 脚本将执行上面第一点中提到的任务。我们将其命名为package.json

      <强> 洁净-pkg.js

      cleanse-pkg.js
    2. 以下辅助 nodejs 脚本将执行上面第二点中提到的任务。我们将这个命名为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; });

      <强> 恢复-pkg.js

      restore-pkg.js
    3. 实施和使用。

      1. 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; }); prepublish脚本在项目postpublish中定义如下:

        Contrived original 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.jscleanse-pkg.js都位于名为restore-pkg.js的隐藏文件夹中,该文件夹本身位于项目目录的顶层,(即与项目.scripts)。两个 nodejs 脚本都可以作为首选重定位,并且在相应的 npm-script 中根据需要重新定义它们的路径。

      2. 鉴于上面提到的package.json,结果发布的tarball中的实际package.json内容如下:

        结果/已发布的package.json

        package.json
      3. devDependencies部分中的包。

        也许您的项目{ ... "scripts": { "keep": ... }, ... } 部分中列出了您希望在已发布的devDependencies中删除的软件包。

        (注意:当用户通过npm-registry安装时,不会下载devDependencies部分中列出的任何软件包)

        然而,也许你想要删除它们。如果这是一个要求,那么package.json也接受可选的第二个参数。这个参数类似于第一个参数,其中每个要从package.json部分删除的命名包必须是;作为单个字符串提供,用逗号分隔,不得包含空格。

        1. 这次假设原始cleanse-pkg.js如下:

          Contrived original package.json

          devDependencies
          • 请注意添加到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\"部分省略哪些包。
        2. 这一次,考虑到上面设想的prepublish,结果发布的tarball中的实际devDependecies内容如下:

          结果/已发布的package.json

          package.json
        3. 运行

          此解决方案假定npm publish将运行以下方法之一:

          1. 从项目目录中没有任何参数。例如。 package.json
          2. 指定项目的路径{ ... "scripts": { "keep": ... }, "devDependencies": { "y": "^0.8.1" }, ... } 。例如。 npm publish
          3. 这不能通过提供包含内置package.json文件的单个文件夹的gzipped tar存档的URL或文件路径来实现。

            附加说明

            1. 要阻止发布实用程序 nodejs 脚本(npm publish path/to/package.jsonpackage.json),应将其添加到项目.npmignore文件中。鉴于上述两个文件的位置,您可以在cleanse-pkg.js中添加restore-pkg.js条目。

            2. 两个实用程序 nodejs 脚本.scripts.npmignore定义:

              • 原始cleanse-pkg.js文件的绝对路径。
              • 应写入临时restore-pkg.js文件的绝对路径。目前,它从项目目录中保存为一级/一级以避免发布。

              如果您选择将package.jsoncached-package.json存储到与上述位置不同的位置,则需要在两个文件中根据需要重新定义以下代码段中的路径。

              cleanse-pkg.js

答案 1 :(得分:1)

您也可以考虑使用此软件包。 https://www.npmjs.com/package/clean-publish

具体来说,它们提供了仅用于packakge.json的工具。

$ npm run clear-package-json package.json -o package/package.json --fields scripts name
# or
$ npm run clear-package-json package.json > package/package.json
# or
$ cat package.json | npm run clear-package-json
# `fields` also will be getted from config file

它似乎完全可以满足您的要求,而且还可以完成更多工作。它似乎具有很高的可配置性。


更新

这是我创建的一个程序包,它可以完成您所请求的操作,但是方式却大不相同。

https://www.npmjs.com/package/clean-package

$ clean-package --remove scripts
相关问题