in cmd/nodejs/pnpm/main.go [84:136]
func pnpmInstallModules(ctx *gcp.Context, pjs *nodejs.PackageJSON) error {
pjs, err := nodejs.OverrideAppHostingBuildScript(ctx, nodejs.ApphostingPreprocessedPathForPack)
if err != nil {
return err
}
buildCmds, _ := nodejs.DetermineBuildCommands(pjs, "pnpm")
// Respect the user's NODE_ENV value if it's set
buildNodeEnv, nodeEnvPresent := os.LookupEnv(nodejs.EnvNodeEnv)
if !nodeEnvPresent {
if len(buildCmds) > 0 {
// Assume that dev dependencies are required to run build scripts to
// support the most use cases possible.
buildNodeEnv = nodejs.EnvDevelopment
} else {
buildNodeEnv = nodejs.EnvProduction
}
}
cmd := []string{"pnpm", "install"}
if _, err := ctx.Exec(cmd, gcp.WithUserAttribution, gcp.WithEnv("CI=true"), gcp.WithEnv("NODE_ENV="+buildNodeEnv)); err != nil {
return gcp.UserErrorf("installing pnpm dependencies: %w", err)
}
if len(buildCmds) > 0 {
// If there are multiple build scripts to run, run them one-by-one so the logs are
// easier to understand.
for _, cmd := range buildCmds {
split := strings.Split(cmd, " ")
if _, err := ctx.Exec(split, gcp.WithUserAttribution); err != nil {
if fahCmd, fahCmdPresent := os.LookupEnv(nodejs.AppHostingBuildEnv); fahCmdPresent {
return gcp.UserErrorf("%w", faherror.FailedFrameworkBuildError(fahCmd, err))
}
if nodejs.HasApphostingPackageBuild(pjs) {
return gcp.UserErrorf("%w", faherror.FailedFrameworkBuildError(pjs.Scripts[nodejs.ScriptApphostingBuild], err))
}
return err
}
}
}
shouldPruneDevDependencies := buildNodeEnv == nodejs.EnvDevelopment && !nodeEnvPresent && nodejs.HasDevDependencies(pjs)
if shouldPruneDevDependencies {
if env.IsFAH() {
// We don't prune if the user is using App Hosting since App Hosting builds don't
// rely on the node_modules folder at this point.
return nil
}
// If we installed dependencies with NODE_ENV=development and the user didn't explicitly set
// NODE_ENV we should prune the devDependencies from the final app image.
cmd := []string{"pnpm", "prune", "--prod"}
if _, err := ctx.Exec(cmd, gcp.WithUserAttribution, gcp.WithEnv("CI=true")); err != nil {
return gcp.UserErrorf("pruning devDependencies: %w", err)
}
}
return nil
}