2016-11-21 45 views
0

所以,我有一个库haste-mapperlink to Github - 我想就此发表一些看法)。它使用gulp,babel-core和一些其他npm包来构建自己,以便在build/目录中拥有有效的JavaScript而不是Flow。我补充说,在package.json一个postinstall钩子脚本:在哪里添加用于运行postinstall挂钩的NPM依赖项?

"postinstall": "gulp build" 

它的工作原理,在脚本开始运行,但它不能满足主机包所需的依赖关系。我有gulpbabel-core作为devDependencies它似乎不安装它们。将它们添加到dependencies似乎语义错误。我试图将它们添加到peerDependencies,但不是安装缺少的东西,而只是抱怨它。

我应该怎么办?

P.S. Herepackage.json

回答

3

如果你想在一个postinstall钩使用的东西,它需要一个dependency

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

为此,您需要将脚本重命名为prepublish,以便在运行npm publish时运行脚本。列出吞咽,巴贝尔等为devDependencies。添加.npmignore文件在你的项目的根目录,包含:

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

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

+0

我一直认为NPM从git仓库直接获取包的代码... – Victor

+1

不,你单独推送到npm。 –

2

我开始留言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 

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

+0

提示:让你的CI做释放,这样开发人员必须少做,当开发人员少做时,开发人员犯的错误就少了。 –

+0

哈,我甚至都不想碰CI,因为这篇文章已经足够了。不过谢谢。另外,我们做了很多迭代,并且只使用CI来在多个环境中运行测试。当一切都过去了,我们准备好了,我们会手工释放,确保我们的标签与npm同步,而且没有太多东西会过期。我们以不同方式处理客户项尽管每个人都是他自己的。 –