From e4995a0be0036033d4f67db04baab900a394dd74 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 24 Jul 2019 05:46:11 -0700 Subject: [PATCH] Run the prepare script of git dependencies even if NODE_ENV=production (#7398) * Run the prepare script of git dependencies even if NODE_ENV=production When installing a git dependency with the `NODE_ENV` environment variable set to `production`, yarn did not run the `prepare` lifecycle script, because `config.production` would default to true, and then `wrapLifecycle` would skip `prepare`: https://github.com/yarnpkg/yarn/blob/b6569538de69e0ccd201f0a33f1f5b52f2656f5b/src/cli/commands/install.js#L1202-L1207 This is contrary to npm's behavior and the intent of `GitFetcher#fetchFromInstallAndPack`, which is to install the dependency with its devDependencies and run all the relevant lifecycle scripts (excluding `prepublish`), regardless of the configuration or environment settings of the parent install command. * Update CHANGELOG.md * Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ __tests__/fetchers.js | 34 ++++++++++++++++++++++++++++++++++ src/fetchers/git-fetcher.js | 1 + 3 files changed, 39 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab65e6ba3c..bcd9f68d6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Please add one entry in this file for each change in Yarn's behavior. Use the sa ## Master +- Runs the `prepare` lifecycle of git dependencies even if `NODE_ENV` is set to `production`. + + [#7398](https://github.com/yarnpkg/yarn/pull/7398) - [**John Firebaugh**](https://github.com/jfirebaugh) + - Fixes the `postversion` lifecycle method not being called when using `--no-git-tag-version`. [#7154](https://github.com/yarnpkg/yarn/pull/7154) - [**Hampus Tågerud**](https://github.com/hampustagerud) diff --git a/__tests__/fetchers.js b/__tests__/fetchers.js index ed5f5b0cc6..55d171b3f0 100644 --- a/__tests__/fetchers.js +++ b/__tests__/fetchers.js @@ -125,6 +125,40 @@ test('GitFetcher.fetch with prepare script', async () => { expect(await fs.exists(path.join(dir, 'generated', 'prepublish'))).toBe(false); }); +test('GitFetcher.fetch with prepare script, NODE_ENV=production', async () => { + const NODE_ENV = process.env.NODE_ENV; + try { + process.env.NODE_ENV = 'production'; + const dir = await mkdir('git-fetcher-with-prepare'); + const fetcher = new GitFetcher( + dir, + { + type: 'git', + reference: 'https://github.com/Volune/test-js-git-repo', + hash: '0e56593e326069ed4bcec8126bb48a1891215c57', + registry: 'npm', + }, + await Config.create(), + ); + await fetcher.fetch(); + const name = (await fs.readJson(path.join(dir, 'package.json'))).name; + expect(name).toBe('test-js-git-repo'); + const dependencyName = (await fs.readJson(path.join(dir, 'dependency-package.json'))).name; + expect(dependencyName).toBe('beeper'); + // The file "prepare.js" is not in "files" list + expect(await fs.exists(path.join(dir, 'prepare.js'))).toBe(false); + // Check the dependency with a bin script was correctly executed + expect(await fs.exists(path.join(dir, 'testscript.output.txt'))).toBe(true); + // Check executed lifecycle scripts + expect(await fs.exists(path.join(dir, 'generated', 'preinstall'))).toBe(true); + expect(await fs.exists(path.join(dir, 'generated', 'install'))).toBe(true); + expect(await fs.exists(path.join(dir, 'generated', 'postinstall'))).toBe(true); + expect(await fs.exists(path.join(dir, 'generated', 'prepublish'))).toBe(false); + } finally { + process.env.NODE_ENV = NODE_ENV; + } +}); + test('TarballFetcher.fetch', async () => { const dir = await mkdir('tarball-fetcher'); const fetcher = new TarballFetcher( diff --git a/src/fetchers/git-fetcher.js b/src/fetchers/git-fetcher.js index 284d594384..8939d06d41 100644 --- a/src/fetchers/git-fetcher.js +++ b/src/fetchers/git-fetcher.js @@ -164,6 +164,7 @@ export default class GitFetcher extends BaseFetcher { binLinks: true, cwd: prepareDirectory, disablePrepublish: true, + production: false, }, this.reporter, ),