Thenpm publish
命令创建一个压缩包(带有src
dir)并将其发布到注册表。
有没有办法排除src
目录,避免使用.npmignore
?
npm 没有提供其他内置功能来实现这一点,因此需要一个自定义解决方案。
如果您真的不想使用.npmignore
将src
目录保留在已发布的包之外,请考虑在 npm 脚本中使用pre
和post
钩子。
相关的钩子是:
prepublishOnly
: 在准备和包装包裹之前运行,仅在npm publish
...
postpublish
:在包发布后运行。
对于 *nix 平台
-
将
prepublishOnly
脚本添加到package.json的scripts
部分,以便在发布之前将src
目录移动到项目目录之外的其他位置。 -
此外,添加一个
postpublish
脚本,用于在发布完成后将src
目录移回项目目录。 -
运行
npm publish
(正常)以发布包。
例如:
包.json
...
"scripts": {
"prepublishOnly": "mv src/ ../",
"postpublish": "mv ../src .",
...
},
...
注意:您需要确保在选择通过prepublish
脚本临时将src
目录移动到的路径位置不存在其他src
文件夹/目录。
跨平台:
对于跨平台解决方案,请考虑使用 shx。此软件包包括一个可移植的mv
命令。在这种情况下,请改为配置prepublish
和postpublish
脚本,如下所示:
包.json
...
"scripts": {
"prepublishOnly": "shx mv src/ ../",
"postpublish": "shx mv ../src .",
...
},
...
可以使用 package.json 中的files
属性显式包含要发布的文件。
{
"files": [
"dist",
"index.js"
]
}
@RobC答案,除了避免使用 .npmignore 的自定义解决方案之外,没有其他方法。
由于我在 Jenkins 管道中使用 publish 命令,因此解决方案是在 Jenkinsfile 中直接执行发布步骤时创建一个临时的 .npmignore :
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/