- package config
-
- import (
- "gerrit.wikimedia.org/r/blubber/build"
- )
-
- // NodeConfig holds configuration fields related to the Node environment and
- // whether/how to install NPM packages.
- //
- type NodeConfig struct {
- Requirements []string `json:"requirements"` // install requirements from given files
- Env string `json:"env" validate:"omitempty,nodeenv"` // environment name ("production" install)
- }
-
- // Merge takes another NodeConfig and merges its fields into this one's,
- // overwriting both the environment and requirements files.
- //
- func (nc *NodeConfig) Merge(nc2 NodeConfig) {
- if nc2.Requirements != nil {
- nc.Requirements = nc2.Requirements
- }
-
- if nc2.Env != "" {
- nc.Env = nc2.Env
- }
- }
-
- // InstructionsForPhase injects instructions into the build related to Node
- // dependency installation and setting of the NODE_ENV.
- //
- // PhasePreInstall
- //
- // Installs Node package dependencies declared in requirements files into the
- // application directory. Only production related packages are install if
- // NodeConfig.Env is set to "production" in which case `npm dedupe` is also
- // run. Installing dependencies during the build.PhasePreInstall phase allows
- // a compiler implementation (e.g. Docker) to produce cache-efficient output
- // so only changes to package.json will invalidate these steps of the image
- // build.
- //
- // PhasePostInstall
- //
- // Injects build.Env instructions for NODE_ENV, setting the environment
- // according to the configuration.
- //
- func (nc NodeConfig) InstructionsForPhase(phase build.Phase) []build.Instruction {
- switch phase {
- case build.PhasePreInstall:
- if len(nc.Requirements) > 0 {
- npmInstall := build.RunAll{[]build.Run{
- {"npm install", []string{}},
- }}
-
- if nc.Env == "production" {
- npmInstall.Runs[0].Arguments = []string{"--production"}
- npmInstall.Runs = append(npmInstall.Runs,
- build.Run{"npm dedupe", []string{}},
- )
- }
-
- return append(
- build.SyncFiles(nc.Requirements, "."),
- npmInstall,
- )
- }
- case build.PhasePostInstall:
- if nc.Env != "" || len(nc.Requirements) > 0 {
- return []build.Instruction{build.Env{map[string]string{
- "NODE_ENV": nc.Env,
- }}}
- }
- }
-
- return []build.Instruction{}
- }
|