Skip to content

Commit

Permalink
Run the prepare script of git dependencies even if NODE_ENV=production (
Browse files Browse the repository at this point in the history
#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
  • Loading branch information
jfirebaugh authored and arcanis committed Jul 24, 2019
1 parent 84e01a9 commit ee29a5f
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Expand Up @@ -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)
Expand Down
34 changes: 34 additions & 0 deletions __tests__/fetchers.js
Expand Up @@ -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(
Expand Down
1 change: 1 addition & 0 deletions src/fetchers/git-fetcher.js
Expand Up @@ -164,6 +164,7 @@ export default class GitFetcher extends BaseFetcher {
binLinks: true,
cwd: prepareDirectory,
disablePrepublish: true,
production: false,
},
this.reporter,
),
Expand Down

0 comments on commit ee29a5f

Please sign in to comment.