所以,我有一个库haste-mapper
(link to Github - 我想对它提出一些意见)。它使用gulp
,babel-core
和一些其他npm包来构建自己,以便有效的JavaScript而不是Flow进入build/
目录。我在postinstall
中添加了package.json
钩子脚本:
"postinstall": "gulp build"
它工作正常,脚本开始运行但它不符合主机包中所需的依赖项。我gulp
和babel-core
为devDependencies
,似乎没有安装它们。将它们添加到dependencies
似乎在语义上是错误的。我尝试将它们添加到peerDependencies
,但不是安装缺少的东西,而是抱怨它。
我应该怎么做?
P.S。 Here是package.json
答案 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
)。主要思想是我们希望在github中保留我们构建的代码的副本以及该版本的“标记”。这使我们可以准确地看到任何特定版本被推送到npm的内容。构建的代码不是主分支的一部分,但在标记下存在 (有点像分支)。当用户报告错误并且他正在使用版本x.x.x时,您可以签出该确切版本并开始调试。修复错误后,您会发布新的“修补程序”,并且您的用户将在下次运行npm install
或npm 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
如果您有任何疑问,请询问。您可能希望以稍微不同的顺序执行操作,因为您的情况稍有不同。请随时提问。这段代码在很多项目中运行得非常好 - 我们每天多次发布新代码。