我有一个在内部git服务器上托管的通用组件的npm包。由于某种原因,当我在另一个项目中调用npm install
时,我想在它中使用这个包,但它没有运行prepare
钩子。显然,这是行不通的,因为npm包需要node_modules中的/dist
文件夹才能使用这个包。
我已经尝试了一些事情,比如使用过时的prepublish
钩子,甚至没有被调用。我还尝试了postinstall
,看看我是否可以在安装后进行构建,虽然那个钩子确实被调用了,但它失败了,因为没有安装devDependencies
package.json
{
"name": "common-components",
"version": "0.1.0",
"scripts": {
"prepare": "npm run build",
"build": "ng build",
...
},
"private": true,
"dependencies": {
...
},
"devDependencies": {
...
},
}
用于安装的命令
npm install --save git+ssh://{URL-to-common-components-repo}}
我已经通读了npm-scripts文档https://docs.npmjs.com/misc/scripts,看起来他们坚持prepare
钩子应该总是被调用用于这个确切的用例
2019年5月6日更新
作为一个说明,我在NPM社区https://npm.community/t/using-npm-ci-does-not-run-prepare-script-for-git-modules/632/4上发现了这个bug。
我使用的是npm 6.4.1,根据错误应该可以正常工作
6条答案
按热度按时间hpcdzsge1#
最近我在一个包上发现了一件需要检查的事情--如果有.gitignore而没有.npmignore,npm可能忽略了你的/dist文件夹。在这种情况下,添加一个空的.npmignore是有效的。
如果没有.npmignore文件,但有.gitignore文件,则npm将忽略与.gitignore文件匹配的内容。如果要包含.gitignore文件排除的内容,可以创建一个空的.npmignore文件来覆盖它。
从https://docs.npmjs.com/misc/developers开始
prdp8dxp2#
对于那些想知道这个状态的人。我无法让它工作。我最终做的是在一个私有的npm注册表上托管组件,这很好,因为
npm publish
命令将完成构建,只发布dist文件夹csga3l583#
如果添加一个空的
.npmignore
没有帮助,您可以尝试在package.json#files
中显式指定dist中的所有文件。如果这样做有效,您可能需要考虑使用与dist中的文件匹配的通配符模式来简化package.json
。package.json
请参阅npm/cli存储库www.example.com中类似问题的注解https://github.com/npm/cli/issues/1287#issuecomment-635021757
hkmswyz64#
很可能您的
dist/
文件夹在您的.gitignore
文件中。根据npm-cli维护人员的以下回应:为了能够正确地准备git repo,npm会通过npm-packlist来运行解压的文件,以获取将要放置在node_modules文件夹中的预期文件。
进一步检查npm-packlist的文档,我们发现如果没有其他内容需要删除,npm-packlist将考虑
.gitignore
文件:如果没有package.json和文件列表,也没有.npmignore文件,但有一个.gitignore文件,则忽略.gitignore文件中的所有文件。
This article进一步扩展了这个想法。
在我看来,最好的解决方法是在
package.json
文件的files部分明确声明你的包需要的文件(包括dist/
),这样你就可以完全控制所包括的文件,并且包的大小也会最小化。i7uq4tfw5#
如果您使用
root
用户对软件包执行npm install
操作,那么准备脚本可能不会被触发。原因是prepare
子进程没有运行权限(当以root用户身份使用npm时,用户帐户被设置为默认值'nobody')。您可以在这里阅读更多信息:https://github.com/npm/npm/issues/17346要解决此问题,请在lib包中创建一个
.npmrc
文件并添加:ymzxtsji6#
在package.json中添加
main
为我解决了这个问题。node v14.15.4
npm 6.14.11