subblue
subblue

Reputation: 1416

Auto reloading a Sails.js app on code changes?

Currently is seems that for any code change in a sails.js app you have to manually stop the sails server and run sails lift again before you can see the changes.

I was wondering if there is any way when running in development mode to automatically restart the sails server when it detects a code change?

Upvotes: 108

Views: 44560

Answers (8)

Mujtaba Kably
Mujtaba Kably

Reputation: 755

install nodemon globally or locally.

npm install nodemon --save
npm install nodemon -g

install sails locally in you project as follows

npm install sails --save

then change package.json

from

"scripts": {
  "debug": "node debug app.js",
  "start": "node app.js"
},

to

"scripts": {
   "debug": "node debug app.js",
   "start": "node app.js",
   "dev": "export NODE_ENV=development && nodemon --ignore 'tmp/*' app.js && exit 0"
},

then

npm run dev

Upvotes: 9

BINFAS K
BINFAS K

Reputation: 255

Better you use

npm install -g nodemon

i am using this, and it will helps to improve my developing speed. no need to edit any files for this one!.

after installation

nodemon app.js

Upvotes: 7

Sandro Munda
Sandro Munda

Reputation: 41030

You have to use a watcher like forever, nodemon, or something else...

Example

  1. Install forever by running:

    sudo npm install -g forever

  2. Run it:

    forever -w start app.js


To avoid infinite restart because Sails writes into .tmp folder, you can create a .foreverignore file into your project directory and put this content inside:

**/.tmp/**
**/views/**
**/assets/**

See the issue on GitHub: Forever restarting because of /.tmp.

Upvotes: 74

Ben Fried
Ben Fried

Reputation: 2204

If you're using Sails 0.11, you can install this hook to automatically reload when you change models or controllers (views do not require reloading):

npm install sails-hook-autoreload

https://www.npmjs.com/package/sails-hook-autoreload

Upvotes: 9

Nick F
Nick F

Reputation: 10112

For anyone coming to this question now, it seems that this is no longer necessary - an application launched with sails lift will have a grunt watch task running, and code changes will be visible without a restart.

I didn't realise this was happening at first because there's nothing to indicate what's happening in the console, but it does seem to work without a restart (I'm using Sails 0.11)

Upvotes: 1

Vitalii Maslianok
Vitalii Maslianok

Reputation: 1631

You can use sails-hook-autoreload

Just lift your app as normal, and when you add / change / remove a model or controller file, all controllers and models will be reloaded without having to lower / relift the app.

Upvotes: 49

josec89
josec89

Reputation: 2162

I had the same problem and I have solved it using grunt-watch and grunt-forever with sails@beta tasks. The result is 4 grunt commands:

UPDATE: tasks are available in the current sails version (it's no longer beta :>)

  • start Starts the server
  • stop Stops the server
  • restart Restarts the server
  • startWatch Starts the server and waits for changes to restart it (using grunt-watch). This is probably your solution, but the other commands are also useful.

Here's the code - I'm using sails@beta, which includes a tasks directory, I don't know if this is included in previous versions:

  • First of all you have to install forever in your sails directory:

    npm install grunt-forever --save-dev
    
  • tasks/config/forever.js Configure forever task.

    module.exports = function(grunt) {
      grunt.config.set('forever', {
        server: {
           options: {
              index: 'app.js',
              logDir: 'logs'
           }
        }
      });
    
      grunt.loadNpmTasks('grunt-forever');
    };
    
  • tasks/config/watch.js (edit) Edit watch task in order to add a new rule

    // api and assets default rules
    ,
    server: {
        // Server files to watch:
        files: [
            'api/**/*',
            'config/**/*'
        ],
    
        // Restart server
        tasks: ['forever:server:restart']
    }
    
  • tasks/register/watchForever.js Register your custom tasks (this file can be renamed to whatever you want)

    module.exports = function(grunt) {
    // Starts server
      grunt.registerTask('start', [
        'compileAssets',
        'linkAssetsBuild',
        'clean:build',
        'copy:build',
        'forever:server:start'
      ]);
    
      // Restarts the server (if necessary) and waits for changes
      grunt.registerTask('startWatch', [
        'restart',
        'watch:server'
      ]);
    
      // Restarts server
      grunt.registerTask('restart', [
        'forever:server:restart'
      ]);
    
      // Stops server
      grunt.registerTask('stop', [
        'forever:server:stop'
     ]);
    };
    

With this you should be able to use

    grunt startWatch

and make your server wait for changes to be restarted :>

Hope this helped!

Upvotes: 7

woss
woss

Reputation: 1003

For example with nodemon to watch api and config directories

.nodemonignore contents

views/*
.tmp/*
.git/*

Run the command after creating .nodemonignore

$> nodemon -w api -w config

Example for supervisor to ignore 3 directories

$> supervisor -i .tmp,.git,views app.js

Upvotes: 45

Related Questions