Gruntjsとgrunt-contrib-watch
プラグインに非常に厄介な問題があります。しばらくすると、定義できなくなります。コンソールがこのエラーを吐き出すのは、30分または2時間の作業(ランダム)である可能性があります。
Running "watch" task
Waiting...Warning: EPERM, operation not permitted 'C:\dev\project\app\index.html~RF97bf99.TMP'
それは約50回繰り返され、次は次のようになります。
Warning: An error occurred while processing a template (An error occurred while processing a templat
e (Maximum call stack size exceeded).).
Warning: An error occurred while processing a template (An error occurred while processing a templat
e (An error occurred while processing a template (Maximum call stack size exceeded).).).
Warning: An error occurred while processing a template (An error occurred while processing a templat
e (An error occurred while processing a template (An error occurred while processing a template (Max
imum call stack size exceeded).).).).
Warning: An error occurred while processing a template (An error occurred while processing a templat
e (An error occurred while processing a template (An error occurred while processing a template (An
error occurred while processing a template (Maximum call stack size exceeded).).).).).
私のGrunfile.js:
'use strict';
module.exports = function (grunt) {
// Load all grunt tasks
require('load-grunt-tasks')(grunt);
// Show elapsed time at the end
require('time-grunt')(grunt);
grunt.initConfig({
// Project settings
project: {
app: 'app',
dist: 'dist'
},
bootstrap: {
src: 'bower_components/sass-bootstrap',
pkg: grunt.file.readJSON('bower_components/sass-bootstrap/package.json'),
banner: '/*!\n' +
' * Bootstrap v<%= bootstrap.pkg.version %> by @fat and @mdo\n' +
' * Copyright <%= grunt.template.today("yyyy") %> <%= bootstrap.pkg.author %>\n' +
' * Licensed under <%= _.pluck(bootstrap.pkg.licenses, "url").join(", ") %>\n' +
' *\n' +
' * Designed and built with all the love in the world by @mdo and @fat.\n' +
' */\n\n',
jqueryCheck: 'if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }\n\n'
},
watch: {
sass: {
files: ['<%= project.app %>/sass/{,*/}*.scss'],
tasks: ['sass:dev', 'autoprefixer'],
options: {
spawn: false,
livereload: true
},
},
js: {
files: [
'<%= project.app %>/js/{,*/}*.js',
'!<%= project.app %>/js/vendor/{,*/}*.js',
'!<%= project.app %>/js/plugins/{,*/}*.js'
],
options: {
livereload: true
}
},
livereload: {
options: {
livereload: '<%= connect.options.livereload %>'
},
files: [
'<%= project.app %>/{,*/}*.html',
'<%= project.app %>/css/{,*/}*.css',
'<%= project.app %>/images/{,*/}*.{gif,jpeg,jpg,png,svg,webp}'
]
}
},
connect: {
options: {
port: 9000,
livereload: 35729,
// Change this to '0.0.0.0' to access the server from outside
hostname: 'localhost'
},
livereload: {
options: {
open: true,
base: '<%= project.app %>'
}
},
dist: {
options: {
open: true,
base: '<%= project.dist %>',
livereload: false
}
}
},
sass: {
options: {
includePaths: ['<%= bootstrap.src %>/lib/']
},
dev: {
files: {
'<%= project.app %>/css/app.css': '<%= project.app %>/sass/app.scss'
}
},
dist: {
files: {
'<%= project.app %>/css/app.css': '<%= project.app %>/sass/app.scss'
}
}
},
autoprefixer: {
options: {
browsers: ['last 2 version']
},
dist: {
files: [{
expand: true,
cwd: '<%= project.app %>/css/',
src: '{,*/}*.css',
dest: '<%= project.app %>/css/'
}]
}
},
concat: {
options: {
nonull: true,
separator: '\n\n'
},
bootstrap: {
options: {
banner: '<%= bootstrap.banner %><%= bootstrap.jqueryCheck %>'
},
src: [
'<%= bootstrap.src %>/js/transition.js',
// '<%= bootstrap.src %>/js/alert.js',
// '<%= bootstrap.src %>/js/button.js',
// '<%= bootstrap.src %>/js/carousel.js',
'<%= bootstrap.src %>/js/collapse.js',
'<%= bootstrap.src %>/js/dropdown.js',
// '<%= bootstrap.src %>/js/modal.js',
// '<%= bootstrap.src %>/js/tooltip.js',
// '<%= bootstrap.src %>/js/popover.js',
// '<%= bootstrap.src %>/js/scrollspy.js',
// '<%= bootstrap.src %>/js/tab.js',
// '<%= bootstrap.src %>/js/affix.js'
],
dest: '<%= project.app %>/js/plugins/bootstrap.js'
},
plugins: {
files: {
'<%= project.app %>/js/plugins.js': ['<%= project.app %>/js/plugins/bootstrap.min.js', '<%= project.app %>/js/plugins/*.min.js']
}
}
},
uglify: {
bootstrap: {
options: {
banner: '<%= bootstrap.banner %>'
},
files: {
'<%= project.app %>/js/plugins/bootstrap.min.js': '<%= concat.bootstrap.dest %>'
}
},
all: {
options: {
preserveComments: 'some',
report: 'min'
},
files: [{
expand: true,
cwd: '<%= project.app %>/js/',
src: ['*.js', '!plugins.js'],
ext: '.min.js',
dest: '<%= project.app %>/js/'
}]
}
},
cssmin: {
options: {
report: 'min'
},
dist: {
expand: true,
cwd: '<%= project.app %>/css/',
src: ['*.css', '!*.min.css'],
dest: '<%= cssmin.dist.cwd %>',
ext: '.min.css'
}
},
imagemin: {
dist: {
files: [{
expand: true,
cwd: '<%= project.app %>/img',
src: ['{,*/}*.{gif,jpeg,jpg,png}'],
dest: '<%= project.dist %>/img'
}]
}
}
});
// Register tasks
// ==================================================
// Run local server
grunt.registerTask('serve', function (target) {
if (target === 'dist') {
return grunt.task.run(['build', 'connect:dist:keepalive']);
}
grunt.task.run([
'connect:livereload',
'watch'
]);
});
// Build JS
grunt.registerTask('build-js', [
'concat:bootstrap',
'uglify',
'concat:plugins'
]);
// Build CSS
grunt.registerTask('build-css', [
'sass:dist',
'autoprefixer',
'cssmin'
]);
// Minify images
grunt.registerTask('test', ['imagemin']);
// grunt.registerTask('default', ['']);
};
package.json(すべての依存関係は最新です):
{
"name": "project",
"version": "0.0.0",
"dependencies": {},
"devDependencies": {
"load-grunt-tasks": "~0.2.1",
"time-grunt": "~0.2.6",
"grunt": "~0.4.2",
"grunt-contrib-watch": "~0.5.3",
"grunt-contrib-connect": "~0.6.0",
"grunt-autoprefixer": "~0.6.3",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-uglify": "~0.2.7",
"grunt-contrib-cssmin": "~0.7.0",
"grunt-sass": "~0.9.0",
"jpegtran-bin": "~0.2.0",
"grunt-contrib-imagemin": "~0.4.0"
}
}
私はWindows7 32ビット、gruntjs v.0.4.2、nodejsv0.10.22を使用しています。この問題を引き起こす可能性のあるアイデアはありますか?そして、どうすれば修正できますか?どうもありがとう。
同様の問題「EPERM、操作が許可されていません...」がありました。これは、管理者モードでCMDを開かなかったことが原因でした。したがって、CMDを右クリックして、管理者として実行します。これで私のエラーは解決しました。
私はこの問題に精通していませんが、Gruntfile.js
でワイルドカードを使用する方法と関係があると思います。同僚はかつて、彼のwatch
タスクの実行に最大3〜4分という信じられないほどの時間がかかっていると不満を漏らしていました。彼は次の構文を使用していました。
/css/{,*/}*.css
私はその問題を抱えていなかったので、彼のGruntfile.js
を私のようにしたときに、次のことを使用していることがわかりました。
/css/**/*.css
...問題全体を解決しました!彼のすべてのタスクは10秒未満で実行されました。
Gruntfile.js
に変更を加えました。diff
ツールを使用して、私のバージョンをあなたのバージョンと比較し、何が変更されたかを確認することをお勧めします。
また、jshint
を使用して、プロジェクト内のJavaScript
、特にGruntfile.js
およびGrunt
にとって重要なその他の構成ファイルをリントすることを強くお勧めします。あなたのGruntfile.js
。 ここの例 (詳細については同じプロジェクトを見てください)。
'use strict';
module.exports = function (grunt) {
// Load all grunt tasks
require('load-grunt-tasks')(grunt);
// Show elapsed time at the end
require('time-grunt')(grunt);
grunt.initConfig({
// Project settings
project: {
app: 'app',
dist: 'dist'
},
bootstrap: {
src: 'bower_components/sass-bootstrap',
pkg: grunt.file.readJSON('bower_components/sass-bootstrap/package.json'),
banner: '/*!\n' +
' * Bootstrap v<%= bootstrap.pkg.version %> by @fat and @mdo\n' +
' * Copyright <%= grunt.template.today("yyyy") %> <%= bootstrap.pkg.author %>\n' +
' * Licensed under <%= _.pluck(bootstrap.pkg.licenses, "url").join(", ") %>\n' +
' *\n' +
' * Designed and built with all the love in the world by @mdo and @fat.\n' +
' */\n\n',
jqueryCheck: 'if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }\n\n'
},
watch: {
sass: {
files: ['<%= project.app %>/sass/**/*.scss'],
tasks: ['sass:dev', 'autoprefixer'],
options: {
spawn: false,
livereload: true
},
},
js: {
files: [
'<%= project.app %>/js/**/*.js',
'!<%= project.app %>/js/vendor/**/*.js',
'!<%= project.app %>/js/plugins/**/*.js'
],
options: {
livereload: true
}
},
livereload: {
options: {
livereload: '<%= connect.options.livereload %>'
},
files: [
'<%= project.app %>/**/*.html',
'<%= project.app %>/css/**/*.css',
'<%= project.app %>/images/**/*.{gif,jpeg,jpg,png,svg,webp}'
]
}
},
connect: {
options: {
port: 9000,
livereload: 35729,
// Change this to '0.0.0.0' to access the server from outside
hostname: 'localhost'
},
livereload: {
options: {
open: true,
base: '<%= project.app %>'
}
},
dist: {
options: {
open: true,
base: '<%= project.dist %>',
livereload: false
}
}
},
sass: {
options: {
includePaths: ['<%= bootstrap.src %>/lib/']
},
dev: {
files: {
'<%= project.app %>/css/app.css': '<%= project.app %>/sass/app.scss'
}
},
dist: {
files: {
'<%= project.app %>/css/app.css': '<%= project.app %>/sass/app.scss'
}
}
},
autoprefixer: {
options: {
browsers: ['last 2 version']
},
dist: {
files: [{
expand: true,
cwd: '<%= project.app %>/css',
src: '/**/*.css',
dest: '<%= project.app %>/css'
}]
}
},
concat: {
options: {
nonull: true,
separator: '\n\n'
},
bootstrap: {
options: {
banner: '<%= bootstrap.banner %><%= bootstrap.jqueryCheck %>'
},
src: [
'<%= bootstrap.src %>/js/transition.js',
// '<%= bootstrap.src %>/js/alert.js',
// '<%= bootstrap.src %>/js/button.js',
// '<%= bootstrap.src %>/js/carousel.js',
'<%= bootstrap.src %>/js/collapse.js',
'<%= bootstrap.src %>/js/dropdown.js'
// '<%= bootstrap.src %>/js/modal.js',
// '<%= bootstrap.src %>/js/tooltip.js',
// '<%= bootstrap.src %>/js/popover.js',
// '<%= bootstrap.src %>/js/scrollspy.js',
// '<%= bootstrap.src %>/js/tab.js',
// '<%= bootstrap.src %>/js/affix.js'
],
dest: '<%= project.app %>/js/plugins/bootstrap.js'
},
plugins: {
files: {
'<%= project.app %>/js/plugins.js': ['<%= project.app %>/js/plugins/bootstrap.min.js', '<%= project.app %>/js/plugins/*.min.js']
}
}
},
uglify: {
bootstrap: {
options: {
banner: '<%= bootstrap.banner %>'
},
files: {
'<%= project.app %>/js/plugins/bootstrap.min.js': '<%= concat.bootstrap.dest %>'
}
},
all: {
options: {
preserveComments: 'some',
report: 'min'
},
files: [{
expand: true,
cwd: '<%= project.app %>/js/',
src: ['*.js', '!plugins.js'],
ext: '.min.js',
dest: '<%= project.app %>/js/'
}]
}
},
cssmin: {
options: {
report: 'min'
},
dist: {
expand: true,
cwd: '<%= project.app %>/css/',
src: ['*.css', '!*.min.css'],
dest: '<%= cssmin.dist.cwd %>',
ext: '.min.css'
}
},
imagemin: {
dist: {
files: [{
expand: true,
cwd: '<%= project.app %>/img',
src: ['/**/*.{gif,jpeg,jpg,png}'],
dest: '<%= project.dist %>/img'
}]
}
}
});
// Register tasks
// ==================================================
// Run local server
grunt.registerTask('serve', function (target) {
if (target === 'dist') {
return grunt.task.run(['build', 'connect:dist:keepalive']);
}
grunt.task.run([
'connect:livereload',
'watch'
]);
});
// Build JS
grunt.registerTask('build-js', [
'concat:bootstrap',
'uglify',
'concat:plugins'
]);
// Build CSS
grunt.registerTask('build-css', [
'sass:dist',
'autoprefixer',
'cssmin'
]);
// Minify images
grunt.registerTask('test', ['imagemin']);
// grunt.registerTask('default', ['']);
};
Linuxでは、ディレクトリのアクセス許可を変更します
$ Sudo chmod -R 777 name_directory