Search code examples
node.jsherokunpm

Running npm scripts conditionally


I have 2 main build configurations - dev and prod. I push updates to a heroku server that run npm install --production to install my app. In the package.json I have the following segment:

"scripts": {
    "postinstall": "make install"
}

that runs a make file that is responsible for uglifying the code and some other minor things.

However, I don't need to run this makefile in development mode. Is there any way to conditionally run scripts with npm?..

Thanks!


Solution

  • You can have something like this defined in your package.json (I'm sure theres a better shorthand for the if statement.)

    "scripts": {
        "postinstall":"if test \"$NODE_ENV\" = \"production\" ; then make install ; fi "
    }
    

    Then when you execute npm with production flag like you stated you already do

    npm install --production
    

    it will execute your make install because it will set $NODE_ENV = production


    When I need to conditionally execute some task(s), I pass environment variables to the script/program and which takes care of that logic. I execute my scripts like this

    NODE_ENV=dev npm run build
    

    and in package.json, you would start a script/program

    "scripts": {
        "build":"node runner.js"
    }
    

    which would check the value of the environment variable to determine what to do. In runner.js I do something like the following

    if (process.env.NODE_ENV){
      switch(process.env.NODE_ENV){
        ....
      }
    }