簡體   English   中英

Gruntjs:如何使復制任務只復制手表上更改的文件

[英]Gruntjs: How to make copy task to copy only changed files on watch

所以在 grunt-contrib-watch 插件信息頁面上,有一個關於如何讓 jshint 只對更改的文件運行的例子。

grunt.initConfig({
  watch: {
    scripts: {
      files: ['lib/*.js'],
      tasks: ['jshint'],
      options: {
        nospawn: true,
      },
    },
  },
  jshint: {
    all: ['lib/*.js'],
  },
});

grunt.event.on('watch', function(action, filepath) {
  grunt.config(['jshint', 'all'], filepath);
});

我還沒有測試過它自己的例子。 但是把它應用到我的復制任務中,但沒有成功。 grunt-contrib-copy 任務設置為復制我的 angular 項目的圖像和模板。 而且我很高興知道我是否可以將這項工作用於復制任務,如果可以,我做錯了什么。

太感謝了。

這是我剝離的 Gruntfile.js。

// Build configurations.
module.exports = function(grunt){

  // Project configuration.
    grunt.initConfig({

      pkg: grunt.file.readJSON('package.json'),

      // Copies directories and files from one location to another.
      copy: {
        // DEVELOPMENT
        devTmpl: {
          files: [{
            cwd     : 'src/tpl/',
            src     : ['**/*'], 
            dest    : 'app/tpl/',
            flatten : false,
            expand  : true
          }]
        },
        devImg: {
          files: [{
            cwd     : 'src/img/',
            src     : ['**/*'], 
            dest    : 'app/img/', 
            flatten : false,
            expand  : true
          }]
        }
      },

      // Watch files for changes and run tasks 
      watch: {
        // Templates, copy
        templates: {
          files : 'src/tpl/**/*',
          tasks : ['copy:devTmpl'],
          options: {
            nospawn: true,
          }
        },
        // Images, copy
        images: {
          files : 'src/img/**/*',
          tasks : ['copy:devImg'],
          options: {
            nospawn: true,
          }
        }
      }

    });

  // Watch events
    grunt.event.on('watch', function(action, filepath) {
      // configure copy:devTmpl to only run on changed file
      grunt.config(['copy','devTmpl'], filepath);
      // configure copy:devImg to only run on changed file
      grunt.config(['copy','devImg'], filepath);
    });

  // PLUGINS:
    grunt.loadNpmTasks('grunt-contrib-copy');


  // TASKS:

    /* DEV: Compiles the app with non-optimized build settings, places the build artifacts in the dist directory, and watches for file changes.
    run: grunt dev */
    grunt.registerTask('dev', 'Running "DEVELOPMENT", watching files and compiling...', [
      'default',
      'watch'
    ]);

    /* DEFAULT: Compiles the app with non-optimized build settings and places the build artifacts in the dist directory.
    run: grunt */
    grunt.registerTask('default', 'Running "DEFAULT", compiling everything.', [
      'copy:devTmpl',
      'copy:devImg'
    ]);

}

使用grunt-sync( https://npmjs.org/package/grunt-sync )代替grunt-contrib-copy,並觀察要同步的目錄。

更新 - 這是一個例子:

grunt.initConfig({
  sync: {
    copy_resources_to_www: {
      files: [
        { cwd: 'src', src: 'img/**', dest: 'www' },
        { cwd: 'src', src: 'res/**', dest: 'www' }
      ]
    }
  }
});

cwd表示當前工作目錄。 copy_resources_to_www只是一個標簽。

您需要將grunt.config指向grunt.config中的正確屬性:

grunt.event.on('watch', function(action, filepath) {
  var cfgkey = ['copy', 'devTmpl', 'files'];
  grunt.config.set(cfgkey, grunt.config.get(cfgkey).map(function(file) {
    file.src = filepath;
    return file;
  }));
});

我已經編寫了一個詳細的示例配置文件,用於同步我項目中更改的文件。 它在任何相關項目中自動運行,並且可以根據您的特定需求進行更新。

文件.js

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

  grunt.initConfig({
    pkg: grunt.file.readJSON("package.json"),

    sync: {
      main: {
        files: [
          {
            cwd: ".",
            src: ["src/**", "LICENSE", "README.md"],
            dest: "dist/<%= pkg.name%>/",
          },
        ],
        verbose: true,
        pretend: false,
        failOnError: true,
        ignoreInDest: "**/.git/**",
        updateAndDelete: true,
        compareUsing: "md5",
      },
    }
  });

  grunt.util.linefeed = "\n";
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM