npm,避免在不使用 .npmignore 的情况下发布 src 目录

npm, avoid publishing of src dir without using .npmignore

npm publish 命令创建一个 tarball(使用 src 目录)并将其发布到注册表。

有没有办法排除 src 目录避免使用 .npmignore

npm 没有提供其他内置功能来实现这一点,因此需要自定义解决方案。

如果你真的不想用.npmignore to keep the src directory out of your published package, then consider utilizing pre and post hooks in your npm scripts代替。

相关的钩子是:

  • prepublishOnly: Run BEFORE the package is prepared and packed, ONLY on npm publish ...

  • postpublish: Run AFTER the package is published.

对于 *nix 平台

  1. prepublishOnly 脚本添加到 package.jsonscripts 部分,移动 src 目录到项目目录之外的另一个位置,然后再发布。

  2. 此外,添加一个 postpublish 脚本,在发布完成后将 src 目录移回项目目录。

  3. 运行 npm publish(按正常情况)发布您的包。

例如:

package.json

...
"scripts": {
  "prepublishOnly": "mv src/ ../",
  "postpublish": "mv ../src .",
  ...
},
...

注意:您需要确保在您选择临时移动[=13]的路径位置不存在其他srcfolder/directory =] 目录通过你的 prepublish 脚本。

跨平台:

对于跨平台解决方案,请考虑使用 shx。这个包包括一个可移植的 mv 命令。在这种情况下,请改为配置您的 prepublishpostpublish 脚本,如下所示:

package.json

...
"scripts": {
  "prepublishOnly": "shx mv src/ ../",
  "postpublish": "shx mv ../src .",
  ...
},
...

作为@RobC 的回答,没有其他方法可以避免使用 .npmignore 的自定义解决方案。

由于我在 Jenkins 管道中使用 publish 命令,一个解决方案是创建一个临时的 .npmignore,同时直接在 Jenkinsfile 中执行发布步骤:

echo "src/" >> .npmignore
echo "*.js" >> .npmignore
echo "*.json" >> .npmignore
echo "Jenkinsfile" >> .npmignore
curl --insecure -u ${USERPASS} 'https://my-repo/api/npm/auth' >> /home/jenkins/.npmrc
npm publish --registry https:// my-repo/api/npm/npm-local/