Mihai Marinescu
Mihai Marinescu

Reputation: 779

export NODE_ENV=production doesn't change process.env.NODE_ENV in gulpfile.js

I'm trying to set the environment variable $NODE_ENV to "production" with

export NODE_ENV=production

but when I try to run my gulp task, it says the variable is undefined:

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)

If I echo $NODE_ENV, however, it shows the production keyword.

My gulp setup in this example is as it follows:

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

If I'm using the full initialisation of devBuild, it is always true, as it doesn't consider the $NODE_ENV change in my terminal

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

Does anyone know why doesn't the variable update in my gulpfile and how can I fix this?

Running on a MAC OSX EL Capitan

Thanks in advance!

LATER EDIT:

I think the error appears because I'm using sudo gulp html;

The reason I'm using sudo is because when I'm using gulp html, I get this error:

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 task is:

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))
})

where

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

and

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

If I use gulp html, the variable changes to production, but I get the error, if I'm using sudo gulp html the task goes through, but the variable doesn't change...

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

NOTE, the NODE_ENV variable is production in both cases...

Thanks

Upvotes: 1

Views: 3058

Answers (4)

Mihai Marinescu
Mihai Marinescu

Reputation: 779

After more investigation and discussion with SLow Loris, I found different solutions:

  1. Change the file permissions of the error file:

    Error: EACCES: permission denied, open '/Users/mmarinescu/Projects/gulpTutorial/build/index.html'

by writing:

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

The downside to this is that I need to set the permission with chmod 755, I need to set the permission again each time I'm running 'gulp html'

  1. use sudo su in the project folder, then export NODE_ENV=production or export NODE_ENV=development and run gulp html - this works okay without running again the file permissions command

  2. delete the index.html file, as it will be re-written again by the gulp command: the index.html is created from the build folder to the production one. you can do this either by deleting it manually or by setting up a gulp task, gulp clean; you set up this task after installing the npm del package, sudo npm install del --save-dev, then in gulpfile.js

    delModule = require('del'); gulp.task('clean', function () { delModule([dest + '*']); //passing into del an array of strings, in this case, just the build folder with all it's files })

Upvotes: 1

Andrei C
Andrei C

Reputation: 812

When using sudo you are running the process as a different user (root). That is why environment variables are undefined. Try setting the right permissions on your files and you should be able to run without sudo

Upvotes: 1

akul
akul

Reputation: 1266

I guess there is no problem with this code if((process.env.NODE_ENV).trim().toLowerCase() !== 'production') { but better you discard brackets if(process.env.NODE_ENV.trim().toLowerCase() !== 'production') {

for the error TypeError: Cannot read property 'trim' of undefined it is because environment NODE_ENV there is no value.

try to check again on NODE_ENV.

also try check with $ NODE_ENV=production gulp [tasks]

Upvotes: 1

Blitz
Blitz

Reputation: 259

use export NODE_ENV = "production". if your production variable is not initialized as a string, trim doesn't work on it.

Upvotes: 0

Related Questions