从repo安装Npm未运行'prepare`

vof42yt1  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(180)

我有一个在内部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,根据错误应该可以正常工作

hpcdzsge

hpcdzsge1#

最近我在一个包上发现了一件需要检查的事情--如果有.gitignore而没有.npmignore,npm可能忽略了你的/dist文件夹。在这种情况下,添加一个空的.npmignore是有效的。
如果没有.npmignore文件,但有.gitignore文件,则npm将忽略与.gitignore文件匹配的内容。如果要包含.gitignore文件排除的内容,可以创建一个空的.npmignore文件来覆盖它。
https://docs.npmjs.com/misc/developers开始

prdp8dxp

prdp8dxp2#

对于那些想知道这个状态的人。我无法让它工作。我最终做的是在一个私有的npm注册表上托管组件,这很好,因为npm publish命令将完成构建,只发布dist文件夹

csga3l58

csga3l583#

如果添加一个空的.npmignore没有帮助,您可以尝试在package.json#files中显式指定dist中的所有文件。如果这样做有效,您可能需要考虑使用与dist中的文件匹配的通配符模式来简化package.json
package.json

...
    "files": [
        "source",
        "dist/cjs/main.js",
        "dist/es/main.js"
    ]
}

请参阅npm/cli存储库www.example.com中类似问题的注解https://github.com/npm/cli/issues/1287#issuecomment-635021757

hkmswyz6

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/),这样你就可以完全控制所包括的文件,并且包的大小也会最小化。

i7uq4tfw

i7uq4tfw5#

如果您使用root用户对软件包执行npm install操作,那么准备脚本可能不会被触发。原因是prepare子进程没有运行权限(当以root用户身份使用npm时,用户帐户被设置为默认值'nobody')。您可以在这里阅读更多信息:https://github.com/npm/npm/issues/17346
要解决此问题,请在lib包中创建一个.npmrc文件并添加:

unsafe-perm: true
ymzxtsji

ymzxtsji6#

在package.json中添加main为我解决了这个问题。

"main": "./dist/index.js",
    "scripts": {
       "build": "babel src --out-dir dist",
       "prepare": "npm run build",
       "lint": "eslint ."
     },

node v14.15.4npm 6.14.11

相关问题