1

所以,我有一个图书馆haste-mapper链接到 Github - 我想对此发表一些意见)。它使用gulp,babel-core和其他一些 npm 包来构建自己,以便将有效的 JavaScript 而不是 Flow 放入build/目录中。我将其作为postinstall钩子脚本添加到package.json

"postinstall": "gulp build"

它可以工作,脚本开始运行,但它不满足主机包中所需的依赖项。我有并且gulp似乎没有安装它们。添加它们在语义上似乎是错误的。我尝试将它们添加到,但没有安装缺少的东西,它只是抱怨它。babel-coredevDependenciesdependenciespeerDependencies

我该怎么办?

PS这里package.json

4

2 回答 2

5

如果你想在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/。正是你想要的!

于 2016-11-21T18:18:57.873 回答
3

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

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

主要想法是我们希望在 github 中保留我们构建代码的副本以及该版本的“标签”。这使我们能够准确地看到任何特定版本推送到 npm 的内容。构建的代码不是主分支的一部分,而是仅存在于标签下(有点像分支)。当用户报告错误并且他使用版本 xxx 时,您可以检查确切的版本并开始调试。当您修复错误时,您会发布一个新的“补丁”,您的用户将在下次运行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

如果您有任何问题,请询问。您可能希望以稍微不同的顺序做事,因为您的情况略有不同。请随时提出问题。这段代码在几十个项目上运行良好——我们每天多次发布新代码。

于 2016-11-21T19:17:59.833 回答