【问题标题】:Grunt in sails.js failing to recognise new taskSails.js 中的咕噜声无法识别新任务
【发布时间】:2015-11-18 22:20:46
【问题描述】:

我正在尝试在sails.js 应用程序中添加一个新的grunt 任务。

为了让我的测试用例简单,我已将复制任务复制到一个新文件 copy-tests.js,该文件也在 tasks/config 文件夹中。

我已经修改了 copy-tests.js 以将 set 方法的第一个参数更新为“copy-tests”,所以它现在读取

module.exports = function(grunt) {
    grunt.config.set('copy-tests', {
        dev: {
            files: [{
                expand: true,
                cwd: './assets',
                src: ['**/*.!(coffee|less)'],
                dest: '.tmp/public'
            }]
        },
        build: {
            files: [{
                expand: true,
                cwd: '.tmp/public',
                src: ['**/*'],
                dest: 'www'
            }]
        }
    });
    grunt.loadNpmTasks('grunt-contrib-copy');
};

我已经更新了 compileAssets.js 以添加我的新任务,所以它现在显示为

module.exports = function (grunt) {
    grunt.registerTask('compileAssets', [
        'clean:dev',
        'jst:dev',
        'less:dev',
        'copy:dev',
        'copy-tests:dev',
        'coffee:dev',
        'jade:dev'
    ]);
};

当我尝试提升sails 应用程序时,我得到'Task "copy-tests:dev" not found'

我知道 grunt 可以看到我的文件,因为我在 Gruntfile.js 中添加了一条日志语句,如下所示

var taskConfigurations = loadTasks('./tasks/config'),
    registerDefinitions = loadTasks('./tasks/register');
    console.log(taskConfigurations);

当此语句记录时,我可以在其他任务中看到复制测试

谁能帮助解释为什么 grunt 声称它找不到 copy-tests:dev ?

另外,也许我会以错误的方式解决这个问题。我想要实现的是有两个复制任务,一个将我的主要构建内容复制到 .tmp 文件夹,第二个将我的客户端测试复制到 .tmp 文件夹。稍后我将确保只有我的开发版本运行两个复制任务,我的生产版本只运行第一个。我认为最好的方法是在 config 文件夹中使用两个 grunt 任务,但也许还有另一种方法......

【问题讨论】:

  • 您是否也在tasks/register文件夹中定义了copy-tests
  • 它是如上所述的compileAssets.js,位于tasks/register文件夹中。您认为注册文件夹中是否还有其他地方需要它?
  • 编辑我的问题以使我的意图更清晰,因为我不想定义新类型的 grunt 任务,只需重用现有的任务
  • 我唯一能想到的就是你调用grunt.loadNpmTasks('grunt-contrib-copy'); 两次——一次用于复制任务,一次用于复制测试任务。尝试删除第二个。或者,尝试扩展复制任务,看看是否可以让它工作。
  • 删除第二个 grunt.loadNpmTasks('grunt-contrib-copy');没有任何区别。请参阅我的答案以获得最终解决方案,感谢乔纳森的指点。

标签: javascript gruntjs sails.js


【解决方案1】:

我没有定义第二个任务来获得替代副本,而是需要按如下方式添加到复制任务中

module.exports = function(grunt) {

    grunt.config.set('copy', {
        dev: {
            files: [{
                expand: true,
                cwd: './assets',
                src: ['**/*.!(coffee|less)'],
                dest: '.tmp/public'
            }]
        },
        devTests: {
            files: [{
                expand: true,
                cwd: './tests',
                src: ['**/*.*'],
                dest: '.tmp/public/tests'
            }]
        },          
        build: {
            files: [{
                expand: true,
                cwd: '.tmp/public',
                src: ['**/*'],
                dest: 'www'
            }]
        }
    });

    grunt.loadNpmTasks('grunt-contrib-copy');
};

我的 compileAssets 看起来像

module.exports = function (grunt) {
    grunt.registerTask('compileAssets', [
        'clean:dev',
        'jst:dev',
        'less:dev',
        'copy:dev',
        'copy:devTests',
        'coffee:dev',
        'jade:dev'
    ]);
};

当我查看sails-linker.js 任务并看到其中有多少目标时,我意识到了这一点。我一直将目标视为构建目标,并假设它们具有 dev、test、prod 等值,但似乎它们是一个更广泛的概念,我可能想做的每种类型的副本都应该是副本中的目标.js 任务。

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多