如何以不同的方式构建但具有相同的package.json?

时间:2019-04-23 17:34:20

标签: git heroku version-control

我的应用有2个版本(分支):主版本和开发版本。它们托管在Heroku的不同域上。

我将源存储在Bitbucket中,然后使用管道将其部署到Heroku。这很方便,但是我有一个问题,我不能告诉BB进行不同的构建。在package.json中,有一行应该不同:

生产版(主版):

"scripts": {
        "heroku-postbuild": "webpack --config webpack.prod.js"
    },

对于开发人员:

"scripts": {
        "heroku-postbuild": "webpack --config webpack.dev.js"
    },

因此,我希望在生产环境中编译,压缩JavaScript代码,并在开发环境中可调试,未压缩状态。

我不知道如何解决这个问题。

我尝试使用git .gitattributes merge = ours 使用2个不同版本的package.json。但是它有两个陷阱:

  1. 合并时仍然有冲突,我必须一直编辑此文件。
  2. 如果我在dev上安装了一些新软件包,则package.json将自动更新,但是prod具有其自己的版本,并且由于没有更新的软件包列表,因此构建将失败。

该问题的正确解决方案是什么?

找到解决方案!

感谢@ piotr.wittchen,即使我使用其他解决方案,他还是强迫我找到它。 原来我可以在package.json https://devcenter.heroku.com/articles/node-best-practices#hook-things-up

中使用环境变量

所以,我只是更改了package.json中的行:

"scripts": {
        "heroku-postbuild": "webpack --config webpack.$env.js"
    },

Heroku开发应用程序中的env变量是“ dev”,而在prod中的变量是“ prod”,它的工作原理就像是魅力,不需要相同文件的不同版本。

2 个答案:

答案 0 :(得分:2)

我和npm一起玩了一段时间,这是我对这个问题的解决方案的建议:

创建一个名为heroku-post-build.sh的bash脚本。

对于master分支,其内容应为:

#!/usr/bin/env bash
webpack --config webpack.prod.js

以及dev分支:

#!/usr/bin/env bash
webpack --config webpack.dev.js

heroku-postbuild目标内部调用bash脚本,如下所示:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "heroku-postbuild": "./heroku-post-build.sh"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

当您要将dev合并到master中时,将出现问题,因为它将覆盖脚本。在这种情况下,您需要进行git cherry采摘。

另一种方法(IMO更好)是创建两个这样的目标:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "heroku-postbuild-dev":  "webpack --config webpack.dev.js"
    "heroku-postbuild-prod": "webpack --config webpack.prod.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

并根据情况调用适当的目标。这样,合并就不会有问题。我不知道在您的项目设置中是否可行。

答案 1 :(得分:0)

我必须在package.json中更改行,并在其中放置 env 变量,这对于不同的应用程序(“ dev”和“ prod”)而言是不同的:

"scripts": {
        "heroku-postbuild": "webpack --config webpack.$env.js"
    },