After migrating to El Capitan, users seem to experience a problem with grunt installations, possibly related to the fundamental changes of El Capitan. In particular, running the grunt -force command leads to EPERM errors. The workflow is as follows:
Assuming npm is installed, go to the grunt directory with package.json and gruntfile.js and call grunt:
grunt --force
Example contents of the Gruntfile.js file:
module.exports = function (grunt) {
// All configuration goes here
grunt.initConfig ({
pkg: grunt.file.readJSON ('package.json'),
concat: {
// Configuration for concatenating files goes here.
dist: {
src: [
'../js/libs/owl.carousel.js',
'../js/libs/jquery.actual.js',
'../js/libs/chosen.jquery.js',
'../js/libs/jquery.parallax.js',
'../js/src/common.js'
],
dest: '../js/pro/global.js',
},
},
uglify: {
build: {
src: '../js/pro/global.js',
dest: '../js/pro/global.min.js',
},
},
imagemin: {
dynamic: {
files: [{
expand: true
cwd: '../img/src/',
src: ['** / *. {png, jpg, gif}'],
dest: '../img/pro/'
}]
}
},
compass: {
dev: {
options: {
sassDir: '../sass',
cssDir: '../css',
fontsDir: '../fonts',
imagesDir: '../img/',
images: '../img/',
javascriptsDir: '../js/pro',
// environment: 'development',
outputStyle: 'compressed',
relativeAssets: true,
httpPath: '.',
}
},
},
watch: {
scripts: {
files: ['../js/**/**.js'],
tasks: ['concat', 'uglify'],
options: {
spawn: true,
},
},
images: {
files: ['../img/src/**.{png,jpg,gif}'],
tasks: ['imagemin'],
options: {
spawn: true,
}
},
compass: {
files: ['../**/*.{scss,sass}'],
tasks: ['compass: dev'],
}
},
svgstore: {
defaults: {
options: {
prefix: 'icon-',
},
files: {
'../img/svg-defs.svg': ['../img/svg/*.svg']
}
}
},
});
// Where we tell Grunt we plan to use this plug-in.
grunt.loadNpmTasks ('grunt-contrib-concat');
grunt.loadNpmTasks ('grunt-contrib-uglify');
grunt.loadNpmTasks ('grunt-contrib-imagemin');
grunt.loadNpmTasks ('grunt-contrib-watch');
grunt.loadNpmTasks ('grunt-contrib-compass');
grunt.loadNpmTasks ('grunt-svgstore');
// Where we tell Grunt what to do when we type "grunt" into the terminal.
grunt.registerTask ('default', ['concat', 'uglify', / * 'imagemin', * / 'compass', 'svgstore', 'watch']);
};
Sample package.json package contents:
{ "name": "Call Me Maybe", "version": "0.2.0", "devDependencies": { "grunt": "^0.4.5", "grunt-contrib-compass": "^1.0.4", "grunt-contrib-concat": "^0.5.1", "grunt-contrib-imagemin": "^0.9.4", "grunt-contrib-sass": "^0.9.2", "grunt-contrib-uglify": "^0.9.2", "grunt-contrib-watch": "^0.6.1", "grunt-svgstore": "^0.5.0" } }
The resulting EPERM errors are as follows:
Running "concat:dist" (concat) task Warning: Unable to write "../js/pro/global.js" file (Error code: EPERM). Used --force, continuing. Running "uglify:build" (uglify) task Warning: Unable to write "../js/pro/global.min.js" file (Error code: EPERM). Used --force, continuing. Running "compass:dev" (compass) task Warning: Command failed: /bin/sh: compass: command not found. Used --force, continuing. Warning: You need to have Ruby and Compass installed and in your system PATH for this task to work. More info: https://github.com/gruntjs/grunt-contrib-compass Used --force, continuing. Running "svgstore:defaults" (svgstore) task Warning: Unable to write "../img/svg-defs.svg" file (Error code: EPERM). Used --force, continuing. Running "watch" task Waiting...
Interestingly, Ruby and Compass are also installed, so it agrees with the theory without root access to folder problems , but how can redirect dependency kernels be redirected to another location (i.e. / usr / local / bin) , so this is not a problem?
During the beta version of El Capitan, some users suggested turning root on through the terminal, although this does not seem to work anymore since the error persists and the / usr / bin folder still does not allow changing permissions.