Grunt:jit-grunt:"量角器的插件"找不到任务

时间:2016-05-01 22:15:37

标签: gruntjs protractor yeoman

我是yeoman / grunt / bower的新手,我正在设置一个angularjs项目:

yo angular

我自己对gruntfile做了一些更改,最近我发现量角器非常有用,我想把它添加到我的项目中。我在网上遵循了很多说明(比如2年前这个Integrating Protractor with Yeoman via Grunt),但我仍然无法正确安装量角器。

这是我的Gruntfile.js :(仅显示相关部分)

'use strict';
module.exports = function (grunt) {

  // Time how long tasks take. Can help when optimizing build times
  require('time-grunt')(grunt);

  // Automatically load required Grunt tasks
  require('jit-grunt')(grunt, {
    useminPrepare: 'grunt-usemin',
    ngtemplates: 'grunt-angular-templates',
    cdnify: 'grunt-google-cdn'
  });

  // Configurable paths for the application
  var appConfig = {
    app: require('./bower.json').appPath || 'app',
    dist: 'dist'
  };

  // Define the configuration for all the tasks
  grunt.initConfig({

    // Project settings
    yeoman: appConfig,

    ...
    ...

    // Automatically inject Bower components into the app
    wiredep: {
      app: {
        src: ['<%= yeoman.app %>/index.html'],
        ignorePath:  /\.\.\//
      },
      test: {
        devDependencies: true,
        src: '<%= karma.unit.configFile %>',
        ignorePath:  /\.\.\//,
        fileTypes:{
          js: {
            block: /(([\s\t]*)\/{2}\s*?bower:\s*?(\S*))(\n|\r|.)*?(\/{2}\s*endbower)/gi,
              detect: {
                js: /'(.*\.js)'/gi
              },
              replace: {
                js: '\'{{filePath}}\','
              }
            }
          }
      },
      sass: {
        src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
        ignorePath: /(\.\.\/){1,2}bower_components\//
      }
    }, 

    ...
    ...

    // Test settings

    karma: {
      unit: {
        configFile: 'test/karma.conf.js',
        singleRun: true
      }
    },

    protractor: {
      options: {
        keepalive: true,
        configFile: 'protractor.conf.js'
      },
      run: {}
    }

  });

  grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    grunt.task.run([
      'clean:server',
      'wiredep',
      'concurrent:server',
      'postcss:server',
      'connect:livereload',
      'watch'
    ]);
  });

  grunt.registerTask('test', [
    'clean:server',
    'wiredep',
    'concurrent:test',
    'postcss',
    'connect:test',
    'karma',
    'protractor:run'
  ]);
};

这是我的package.json

{
  "name": "Website",
  "private": true,
  "devDependencies": {
    "autoprefixer-core": "^5.2.1",
    "compass": "^0.1.1",
    "grunt": "^0.4.5",
    "grunt-angular-templates": "^0.5.7",
    "grunt-concurrent": "^1.0.0",
    "grunt-contrib-clean": "^0.6.0",
    "grunt-contrib-compass": "^1.0.0",
    "grunt-contrib-concat": "^0.5.0",
    "grunt-contrib-connect": "^0.9.0",
    "grunt-contrib-copy": "^0.7.0",
    "grunt-contrib-cssmin": "^0.12.0",
    "grunt-contrib-htmlmin": "^0.4.0",
    "grunt-contrib-imagemin": "^1.0.0",
    "grunt-contrib-jshint": "^0.11.0",
    "grunt-contrib-uglify": "^0.7.0",
    "grunt-contrib-watch": "^0.6.1",
    "grunt-filerev": "^2.1.2",
    "grunt-google-cdn": "^0.4.3",
    "grunt-jscs": "^1.8.0",
    "grunt-karma": "^0.12.2",
    "grunt-newer": "^1.1.0",
    "grunt-ng-annotate": "^0.9.2",
    "grunt-postcss": "^0.5.5",
    "grunt-protractor-runner": "^3.0.0",
    "grunt-svgmin": "^2.0.0",
    "grunt-usemin": "^3.0.0",
    "grunt-wiredep": "^2.0.0",
    "jasmine-core": "^2.4.1",
    "jit-grunt": "^0.9.1",
    "jshint-stylish": "^1.0.0",
    "karma": "^0.13.22",
    "karma-jasmine": "^0.3.8",
    "karma-phantomjs-launcher": "^1.0.0",
    "karma2": "^0.13.22",
    "phantomjs-prebuilt": "^2.1.7",
    "protractor": "^3.0.0",
    "time-grunt": "^1.0.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "scripts": {
    "test": "karma start test/karma.conf.js",
    "install": "node node_modules/protractor/bin/webdriver-manager update"
  },
  "dependencies": {}
}

我使用了jit-grunt(现在默认使用),所以它会为我加载这些插件。

我确实按照上面提到的帖子以及protractorgrunt-protractor-runner的官方网站等其他来源安装了protractorgrunt-protractor-runner。在我当地的node_modules

$ ls node_modules/ | grep protractor
grunt-protractor-runner
protractor

但无论我做什么,我仍然会从grunt中得到错误:

$ grunt protractor

jit-grunt: Plugin for the "protractor" task not found.
If you have installed the plugin already, please setting the static mapping.
See https://github.com/shootaroo/jit-grunt#static-mappings

Warning: Task "protractor" failed. Use --force to continue.

运行grunt测试:

$ grunt test

Running "clean:server" (clean) task
>> 1 path cleaned.

...
...

Running "karma:unit" (karma) task
01 05 2016 15:03:51.048:WARN [watcher]: Pattern 
01 05 2016 15:03:51.094:INFO [karma]: Karma v0.13.22 server started at http://localhost:8080/
01 05 2016 15:03:51.112:INFO [launcher]: Starting browser PhantomJS
01 05 2016 15:03:52.259:INFO [PhantomJS 2.1.1 (Mac OS X 0.0.0)]: Connected on socket /#68w8QMUehAm8AAf2AAAA with id 17032121
PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 2 of 2 SUCCESS (0.003 secs / 0.026 secs)

jit-grunt: Plugin for the "protractor" task not found.
If you have installed the plugin already, please setting the static mapping.
See https://github.com/shootaroo/jit-grunt#static-mappings

Warning: Task "protractor:run" failed. Use --force to continue.

Aborted due to warnings.

我错过了什么吗?我已经坚持了几天。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

感谢@theaccordance提出的建议和提示。事实证明,JIT-grunt可能在加载grunt-protractor-runner时遇到一些困难。

在Gruntfile.js中添加grunt.loadNpmTasks('grunt-protractor-runner');将解决问题。

答案 1 :(得分:0)

接受的答案遵循反模式并且违背了Grunt的JIT(Just In Time)插件加载器的目的。

jit-grunt的目标是自动加载所需的插件,从而使grunt.loadNpmTasks的使用过时。

jit-grunt protractor解释了插件加载器如何查找插件:

  

将自动从任务名称搜索插件。搜索   以下顺序:

     
      
  1. node_modules /咕噜-的contrib任务名称
  2.   
  3. node_modules /咕噜任务名称
  4.   
  5. node_modules /任务的名称
  6.   

由于您有一个任务grunt-contrib-protractor,插件加载器将尝试按此顺序查找相应的插件:

  1. packages.json
      {li}在grunt-protractor 中不存在
  2. packages.json
      {li}在protractor 中不存在
  3. packages.json
    • protractor
    • 中找到
    • 遗憾的是不匹配
    • 任务grunt-protractor-runner所需的插件为taskname
  4. 在这种情况下,我们可以设置静态映射,如错误消息所指出的那样。我们采用grunt_plugin_name// Automatically load required Grunt tasks require('jit-grunt')(grunt, { useminPrepare: 'grunt-usemin', ngtemplates: 'grunt-angular-templates', cdnify: 'grunt-google-cdn', protractor: 'grunt-protractor-runner' });

    格式执行此操作
     INSERT INTO source_count (field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    

    这是一个老问题,但我希望我的回答可以帮助遇到此问题的其他人。