Skip to content

Instantly share code, notes, and snippets.

@rachaelshaw
Last active August 29, 2015 14:06
Show Gist options
  • Save rachaelshaw/7d79206345a359763aca to your computer and use it in GitHub Desktop.
Save rachaelshaw/7d79206345a359763aca to your computer and use it in GitHub Desktop.
How to set up a Sails generator

#How to set up a Sails Generator

cd into the directory where you keep this kind of thing, and do:

sails generate generator GENERATOR-NAME

cd GENERATOR-NAME

npm link

Then, check and see if a ~/.sailsrc file exists in your home directory. If it doesn't, create one. Otherwise, just edit it. It should look like this:

{
  "generators": {
    "modules": {
      "GENERATOR-NAME": "sails-generate-GENERATOR-NAME"
    }
  }
}

Now, create a clean directory wherever you plan on keeping your project. (You don't have to do this in a clean directory, it just reduces the chances of anything getting messed up.) In that directory, create a package.json file with the following:

{
 "name": "whatever-doesnt-matter",
 "version": "0.0.0",
 "description":"",
 "main": "index.js",
 "scripts": {
   test: "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "MIT"
}

After creating that, run:

npm link sails-generate-GENERATOR-NAME

This creates a node_modules folder with a shortcut to sails-generate-GENERATOR-NAME inside.

Now to generate a project, you do:

sails generate GENERATOR-NAME

...but that won't be very useful yet. First you'll want to do some setup.

##Generator.js

Open up the project for your generator and go to Generator.js. This is where you can configure your generator to do cool things.

The before function

In the before function, you can configure sccope variables. scope.args contains the raw command line arguments. e.g. if you were to type

sails generate GENERATOR-NAME my arguments here

scope.args would be: ['my','arguments','here'].

You can also set other command-line flags to be available on the scope. So you could do:

sails generate GENERATOR-NAME --appname=myCoolApp

and scope.appname would be myCoolApp.

In my generator's before function, I did:

scope.appname = scope.args[0] || 'My New App';

That way, you can just set the appname by doing sails generate GENERATOR-NAME nameOfMyApp.

###targets The targets object is where you set up the files and folders you want your generator to create by default. The key to each object in targets is the path to the file/folder in the generated project. (For these examples, I'll use ./path/to_a/thing.) The value of ./path/to_a/thing is another object, which can be have one of three different keys:

####folder helper To create an empty folder at a static path, add to targets:

./path/to_a/thing: {
  folder: {}
}

####template helper When you want to include a file in your generated project that has a pre-made template, but also uses things from the scope, you use the template helper:

./path/to_a/thing.js: {
  template: {
    templatePath: 'folderWithMyTemplate/thing.html'
  }
}

You can then go to folderWithMyTemplate in your generator project and add thing.html, which might look like this:

<h1>This is my app, <%= appname %>.</h1>

Then, when you create a new project using the generator, appname from the scope will replace <%= appname %> in the template.

####copy helper If you just want to completely copy a template without replacing anything with scope variables, you can use the copy helper in place of template, and the file in your final project will look exactly like the file in your generator.

./path/to_a/thing.js: {
  copy: {
    templatePath: 'folderWithMyTemplate/thing.js'
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment