diff --git a/packages/@vue/cli-service/__tests__/Service.spec.js b/packages/@vue/cli-service/__tests__/Service.spec.js index a62eb85d8..2a30c9369 100644 --- a/packages/@vue/cli-service/__tests__/Service.spec.js +++ b/packages/@vue/cli-service/__tests__/Service.spec.js @@ -10,13 +10,13 @@ const mockPkg = json => { fs.writeFileSync('/package.json', JSON.stringify(json, null, 2)) } -const createMockService = (plugins = [], init = true) => { +const createMockService = (plugins = [], init = true, mode) => { const service = new Service('/', { plugins, useBuiltIn: false }) if (init) { - service.init() + service.init(mode) } return service } @@ -30,9 +30,33 @@ test('env loading', () => { fs.writeFileSync('/.env.local', `FOO=1\nBAR=2`) fs.writeFileSync('/.env', `BAR=3\nBAZ=4`) createMockService() + expect(process.env.FOO).toBe('0') expect(process.env.BAR).toBe('2') expect(process.env.BAZ).toBe('4') + + delete process.env.FOO + delete process.env.BAR + delete process.env.BAZ + fs.unlinkSync('/.env.local') + fs.unlinkSync('/.env') +}) + +test('env loading for custom mode', () => { + const prevNodeEnv = process.env.NODE_ENV + delete process.env.NODE_ENV + + fs.writeFileSync('/.env', 'FOO=1') + fs.writeFileSync('/.env.staging', 'FOO=2\nNODE_ENV=production') + createMockService([], true, 'staging') + + expect(process.env.FOO).toBe('2') + expect(process.env.NODE_ENV).toBe('production') + + delete process.env.FOO + process.env.NODE_ENV = prevNodeEnv + fs.unlinkSync('/.env') + fs.unlinkSync('/.env.staging') }) test('loading plugins from package.json', () => { diff --git a/packages/@vue/cli-service/lib/Service.js b/packages/@vue/cli-service/lib/Service.js index 86e27a56f..0f29950ab 100644 --- a/packages/@vue/cli-service/lib/Service.js +++ b/packages/@vue/cli-service/lib/Service.js @@ -81,15 +81,6 @@ module.exports = class Service { } loadEnv (mode) { - if (mode) { - // by default, NODE_ENV and BABEL_ENV are set to "development" unless mode - // is production or test. However this can be overwritten in .env files. - process.env.NODE_ENV = process.env.BABEL_ENV = - (mode === 'production' || mode === 'test') - ? mode - : 'development' - } - const logger = debug('vue:env') const basePath = path.resolve(this.context, `.env${mode ? `.${mode}` : ``}`) const localPath = `${basePath}.local` @@ -108,6 +99,19 @@ module.exports = class Service { load(localPath) load(basePath) + + // by default, NODE_ENV and BABEL_ENV are set to "development" unless mode + // is production or test. However the value in .env files will take higher + // priority. + const defaultNodeEnv = (mode === 'production' || mode === 'test') + ? mode + : 'development' + if (process.env.NODE_ENV == null) { + process.env.NODE_ENV = defaultNodeEnv + } + if (process.env.BABEL_ENV == null) { + process.env.BABEL_ENV = defaultNodeEnv + } } resolvePlugins (inlinePlugins, useBuiltIn) {