export NODE_ENV = production并没有改变gulpfile.js中的process.env.NODE_ENV

时间:2015-11-26 22:13:23

标签: node.js macos gulp environment-variables

我试图将环境变量$ NODE_ENV设置为" production"与

export NODE_ENV=production

但是当我尝试运行我的gulp任务时,它表示该变量未定义:

if((process.env.NODE_ENV).trim().toLowerCase() !== 'production') {
                     ^

TypeError: Cannot read property 'trim' of undefined
at Object.<anonymous> (/Users/mmarinescu/Projects/gulpTutorial/gulpfile.js:15:26)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at Liftoff.handleArguments (/usr/local/lib/node_modules/gulp/bin/gulp.js:116:3)
at Liftoff.<anonymous> (/usr/local/lib/node_modules/gulp/node_modules/liftoff/index.js:192:16)
at module.exports (/usr/local/lib/node_modules/gulp/node_modules/liftoff/node_modules/flagged-respawn/index.js:17:3)

但是,如果我echo $NODE_ENV,它会显示生产关键字。

本例中我的gulp设置如下:

var devBuild = ((process.env.NODE_ENV).trim().toLowerCase() !== 'production')

如果我使用devBuild的完整初始化,它总是正确的,因为它没有考虑终端中的$ NODE_ENV更改

var devBuild = ((process.env.NODE_ENV || 'development').trim().toLowerCase() !== 'production')

有谁知道为什么我的gulpfile中没有变量更新?我该如何解决这个问题?

在MAC OSX EL Capitan上运行

提前致谢!

LATER EDIT:

我认为错误的出现是因为我使用的是sudo gulp html;

我使用sudo的原因是因为当我使用gulp html时,我收到此错误:

gulptutorial 1.0.0, production build
[00:44:21] Using gulpfile ~/Projects/gulpTutorial/gulpfile.js
[00:44:21] Starting 'html'...
[00:44:22] 'html' errored after 101 ms
[00:44:22] Error: EACCES: permission denied, open      '/Users/mmarinescu/Projects/gulpTutorial/build/index.html'
at Error (native)

gulp任务是:

gulp.task('html', function() {
var page = gulp.src(html.in).pipe(preprocess({ context: html.context }));//we add the preprocessed html to a var
if(!devBuild) { //global variable defined on step 7
    page = page.pipe(htmlclean());//minifying the html only if we're in the production mode

    console.log(devBuild)
}
return page.pipe(gulp.dest(html.out))
})

其中

html = {
    in: source + '*.html',
    out: dest,
    context: {
        devBuild: devBuild
    }
};

var source = 'source/',
dest = 'build/';

如果我使用gulp html,变量会更改为生产,但我收到错误,如果我使用sudo gulp html任务完成,但变量不会改变...

gulpTutorial mmarinescu$ export   NODE_ENV=production
gulpTutorial mmarinescu$  gulp html
gulptutorial 1.0.0, production build
[00:58:12] Using gulpfile ~/Projects/gulpTutorial/gulpfile.js
[00:58:12] Starting 'html'...
[00:58:12] 'html' errored after 87 ms
[00:58:12] Error: EACCES: permission denied, open '/Users/mmarinescu/Projects/gulpTutorial/build/index.html'
at Error (native)

VS

gulpTutorial mmarinescu$ sudo gulp html
gulptutorial 1.0.0, development build
[01:02:10] Using gulpfile ~/Projects/gulpTutorial/gulpfile.js
[01:02:10] Starting 'html'...
[01:02:10] Finished 'html' after 67 ms

注意,NODE_ENV变量在两种情况下都是生产...

由于

4 个答案:

答案 0 :(得分:1)

我想这段代码if((process.env.NODE_ENV).trim().toLowerCase() !== 'production') {没问题,但最好丢弃括号if(process.env.NODE_ENV.trim().toLowerCase() !== 'production') {

错误TypeError: Cannot read property 'trim' of undefined这是因为环境NODE_ENV没有值。

尝试再次检查NODE_ENV。

还可以尝试使用$ NODE_ENV=production gulp [tasks]

进行检查

答案 1 :(得分:1)

使用sudo时,您将以不同的用户(root)身份运行该进程。这就是环境变量未定义的原因。尝试为您的文件设置正确的权限,您应该能够在没有sudo的情况下运行

答案 2 :(得分:1)

经过与SLow Loris的更多调查和讨论后,我找到了不同的解决方案:

  1. 更改错误文件的文件权限:

    错误:EACCES:权限被拒绝,打开'/Users/mmarinescu/Projects/gulpTutorial/build/index.html'

  2. 写作:

    chmod 755 /Users/mmarinescu/Projects/gulpTutorial/build/index.html
    

    这方面的缺点是我需要使用chmod 755设置权限,每次运行'gulp html'时我都需要再次设置权限

    1. 在项目文件夹中使用sudo su,然后export NODE_ENV=productionexport NODE_ENV=development并运行gulp html - 这样就可以了,无需再次运行文件权限命令

    2. 删除index.html文件,因为它将由gulp命令重新编写:index.html是从build文件夹创建到生产文件夹的。您可以通过手动删除或通过设置gulp任务gulp clean来执行此操作;在安装npm del package sudo npm install del --save-dev之后设置此任务,然后在gulpfile.js中

      delModule = require('del'); gulp.task('clean',function(){ delModule([dest +'*']); //传入del一个字符串数组,在本例中,只是包含所有文件的build文件夹 })

答案 3 :(得分:0)

使用export NODE_ENV =“production”。如果您的生产变量未初始化为字符串,则修剪不起作用。