Code Monkey home page Code Monkey logo

grunt-environment's Introduction

Grunt: Environment

Add environment-centric logic to your Grunt builds

Strider Status Build Status status Dependency Status devDependency Status Gittip

NPM

Getting Started

This plugin requires Grunt ~0.4.1

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:

npm install grunt-environment --save-dev

Once the plugin has been installed, it may be enabled inside your Gruntfile with this snippet of JavaScript:

grunt.initConfig({
  // ...

  environment: {
    default: 'development',
    environments: ['development', 'production'],
    version: function(){
      return grunt.file.readJSON('package.json')['version']
    },
    file: 'build.json'
  }

  // ...
});

grunt.loadNpmTasks('grunt-environment');

Any of the above options can also be a function except for the environments array.

The grunt-environment plugin will add the tasks environment:development and environment:production (for each entry in your environments array).

They will maintain state in a file called .grunt/environment.json in your project directory.

Divergent task configuration

There are two ways to create Grunt configuration for your environments.

Branched object

This bit of syntactic sugar added in v0.4.0 covers most common scenarios.

Example

config: {
  hostname: 'http://development.example.com', // (unaffected)
  development: {
    output_dir: 'build/development'
  },
  production: {
    output_dir: 'build/production'
  },
  environment: {
    default: 'development',
    environments: ['development', 'production']
  }
}

The environment you are using gets merged back into the main config:

grunt environment:production

...makes the config behave as if it were:

config: {
  hostname: 'http://development.example.com', // (unaffected)
  output_dir: 'build/production',
}

Conditional logic

For more complex configuration, you can also use grunt.config.get('environment.env') or it's handy alias grunt.environment() in your Grunt tasks to create conditions around these environments.

Example

// Environment-specific configuration for grunt-contrib-clean.
// When the **development** environment is active, `grunt clean` will remove files inside `build/development`
// When the **production** environment is active, `grunt clean` will remove files inside `build/production`

clean: {
  build: (function() {
    switch (grunt.environment()) {
      case 'development':
        return ['build/development'];
      case 'production':
        return ['build/production'];
    }
  })()
}

v0.2.0 adds the alias grunt.environment() to the current env value.

The additional keys timestamp and version are included as well.

You may find it useful to pass build as a variable into a template for your application to use at runtime.

Release History

0.4.2

  • Extend to allow pulling environment vars from global config (see #4)

0.4.0

  • Adds Branched Object merge feature suggested by @colwilson
  • Adds dependency lodash (Grunt external libraries are deprecated)
  • Original configuration is now preserved upon initialization as config.environment.meta

0.3.0

  • No longer necessary to try/catch initialize manually after tasks are loaded
  • Adds grunt environment (with no subtask) to echo current environment from file

0.2.1

  • Small fixes

0.2.0

  • Adds grunt.environment() alias
  • Bit of overall refactoring
  • Moves default storage from build.json to .grunt/environment.json
  • Adds configurable options default, environments, version, file

0.1.0

  • First release

Bitdeli Badge

xrefs funcs top func library users authors Total views Views in the last 24 hours

grunt-environment's People

Contributors

bitdeli-chef avatar colwilson avatar logankoester avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

grunt-environment's Issues

problems running with load-grunt-config

load-grunt-config calls load-grunt-tasks by default and so if you try to use it with grunt-environment it will fail because load-grunt-tasks tries to load grunt-environment before grunt.config is initialized.

so this will fail:

module.exports = (grunt) ->
  require("load-grunt-config") grunt,
    config:
      thing: "thingy"
      number: 42

      environment:
        default: "development"
        environments: ["development", "production"]
        version: ->
          grunt.file.readJSON("package.json")["version"]

There are two ways around this. EITHER rename grunt-environment so that it does not begin with "grunt", say load-grunt-environment:

module.exports = (grunt) ->
  require("load-grunt-config") grunt,
    config:
      thing: "thingy"
      number: 42

      environment:
        default: "development"
        environments: ["development", "production"]
        version: ->
          grunt.file.readJSON("package.json")["version"]

  require("load-grunt-environment") grunt

or, probably simpler, do this:

module.exports = (grunt) ->
  require("load-grunt-config") grunt,
    loadGruntTasks: false 
    config:
      thing: "thingy"
      number: 42

      environment:
        default: "development"
        environments: ["development", "production"]
        version: ->
          grunt.file.readJSON("package.json")["version"]

  require("load-grunt-tasks") grunt

Either way you might want to document this as it makes it obvious that theyy can work together smoothly.

Documentation is confusing

I cannot get this to work. I consider docs confusing.
I understand that i have to add environment key to the grunt.initConfig,
but don't understand where to put that config object (where values for different envs are stored)?

I'm experimenting with following setup. Cannot get it to work

    grunt.initConfig({
        environment: {
            default: 'development',
            environments: ['development', 'production'],
            version: function(){
                return grunt.file.readJSON('package.json')['version']
            },
            file: 'build.json',
            config: {...}
        },
...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.