在哪里添加NPM依赖项以运行postinstall挂钩?

时间:2016-11-21 17:12:51

标签: json node.js npm npm-install post-install

所以,我有一个库haste-mapperlink to Github - 我想对它提出一些意见)。它使用gulpbabel-core和一些其他npm包来构建自己,以便有效的JavaScript而不是Flow进入build/目录。我在postinstall中添加了package.json钩子脚本:

"postinstall": "gulp build"

它工作正常,脚本开始运行但它不符合主机包中所需的依赖项。我gulpbabel-coredevDependencies,似乎没有安装它们。将它们添加到dependencies似乎在语义上是错误的。我尝试将它们添加到peerDependencies,但不是安装缺少的东西,而是抱怨它。

我应该怎么做?

P.S。 Herepackage.json

2 个答案:

答案 0 :(得分:3)

如果您想在postinstall挂钩中使用某些内容,则需要dependency

但是,你做错了。安装后你不应该编译代码。相反,您应该在发布包之前转换代码。

为此,您需要将脚本重命名为prepublish,以便在运行npm publish时运行该脚本。将gulp,babel等列为devDependencies。在项目的根目录中添加.npmignore文件,其中包含:

/src/

.npmignore文件就像.gitignore一样。您不希望发布的包中包含src/目录,只需build/。确保将.npmignore提交给git。如果您没有.npmignore,则npm将使用.gitignore文件。这不是你想要的,因为版本控制会忽略build/,但应该包含在npm包中。

运行npm publish时,npm会在捆绑您的注册表包之前运行prepublish挂钩。然后当某人npm install成为您的包时,他们将获得build/文件夹,但不会获得src/。正是你想要的!

答案 1 :(得分:3)

我开始对RyanZim的答案发表评论,因为他的技术是正确的。但是,我想提出一个稍微不同的方法。我们公司维护着许多开源项目,这就是我们建议您的方式。

  • 像往常一样继续开发项目。您的.gitignore文件应该忽略您的dist目录(在您的情况下为/build)。
  • 当您准备部署时,您希望构建代码,在package.json中删除版本号,标记更改,并将构建的代码推送到github和npm。

主要思想是我们希望在github中保留我们构建的代码的副本以及该版本的“标记”。这使我们可以准确地看到任何特定版本被推送到npm的内容。构建的代码不是主分支的一部分,但在标记下存在 (有点像分支)。当用户报告错误并且他正在使用版本x.x.x时,您可以签出该确切版本并开始调试。修复错误后,您会发布新的“修补程序”,并且您的用户将在下次运行npm installnpm update时获得更改。

我们已经创建了一组npm脚本来为我们完成大部分工作。这是我们使用的(这在你的package.json中):

"scripts": {
    "build": "node build.js",
    "preversion": "npm run build",
    "version": "git commit -am \"Update dist for release\" && git checkout -b release && git add -f dist/",
    "postversion": "git push --tags && git checkout master && git branch -D release && git push",
    "release:pre": "npm version prerelease && npm publish",
    "release:patch": "npm version patch && npm publish",
    "release:minor": "npm version minor && npm publish",
    "release:major": "npm version major && npm publish"
}

我知道这可能看起来令人困惑,所以让我解释一下。每当我们准备发布新代码时,我们都会运行release:命令之一。例如,当我们运行npm run release:minor时,这里是按顺序运行的命令列表。我已对其进行了注释,以便您可以看到会发生什么:

node build.js             ## run the build code - you will want to run gulp instead
npm version minor         ## bumps the version number in package.json and creates a new git tag
git commit -am "Update dist for release"    ## commit the package.json change to git (with new version number) - we will push it at the end
git checkout -b release   ## create a temporary "release" branch
git add -f dist/          ## force add our dist/ directory - you will want to add your build/ directory instead
npm publish               ## push the code to npm
git push --tags           ## push the built code and tags to github
git checkout master       ## go back to the master branch
git branch -D release     ## delete the temporary "release" branch
git push                  ## push the updated package.json to github

如果您有任何疑问,请询问。您可能希望以稍微不同的顺序执行操作,因为您的情况稍有不同。请随时提问。这段代码在很多项目中运行得非常好 - 我们每天多次发布新代码。