2013-05-28 15 views
1

我想写我的第一个Grunt任务,从我的公共libs文件夹中复制一些文件,这是我的项目目录。在gruntjs中使用常量

  • 项目文件夹:/home/user/projects/bottle
  • 常见libs目录:/home/user/projects/common
  • 文件源是常见的libs目录内的:lib/general/static/js/
  • 文件目标项目文件夹内:lib

我具有公用库目录路径的properties.json文件,如下所示

{ 
    "common_libs" : `/home/user/projects/common` 
} 

现在我已经尝试过是:

module.exports = function(grunt) { 

    var properties = grunt.file.readJSON('properties.json'), 
     paths = { 
      common_libs : properties.common_libs, 
      common_libs_js : this.common_libs + "lib/general/static/js/" 
     }; 

    grunt.initConfig({ 
     copy: { 
      main: { 
       files: [ 
        { 
         expand: true, 
         flatten : true, 
         src: [ 
          paths.common_libs_js + "/*" 
         ], 
         dest: 'lib/', 
         filter: 'isFile' 
        } 
       ] 
      } 
     } 
    }); 

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

我正在咕噜如下 grunt copy

有了这个没有文件被复制到目标。

在这帮助我。

另外我想知道

  1. 我如何使用Ant的属性标签类型常量GruntJS?因为我从properties.json获取基础文件夹,我需要从基础文件夹下的不同文件夹复制许多文件。
  2. 我们可以为每个任务设置这些类型的常量吗?

在此先感谢。

回答

7

你的代码有几个问题。第一:

common_libs_js : this.common_libs + "lib/general/static/js/" 

不幸的是this.common_libs未定义(this没有指向,你认为它),所以common_libs_js最终被'undefinedlib/general/static/js/',这是行不通的。

第二个问题是在同一行上连接路径,但第一个路径(来自属性文件)似乎不以斜线结尾,并且如果它不是以前的路径将变为'/home/user/projects/commonlib/general/static/js/'问题。

第三,你会得到你的dest路径中的一大堆文件夹。当使用扩展选项时,Grunt使用src属性中给出的路径来创建文件夹结构。如果要将/home/user/projects/common/lib/general/static/js/foo.js复制到lib/foo.js,则应将cwd选项设置为paths.common_libs_js,并将src设置为'*.js'(或'**/*.js'以获得任何级别的匹配)。

人们通常在Grunt的配置中嵌入配置属性,然后使用模板字符串来访问它们。写出你的任务非常常见的方法是这样的(有一些变化,根据需要进行调整):

module.exports = function(grunt) { 

    grunt.initConfig({ 
     properties: grunt.file.readJSON('properties.json'), 
     copy: { 
      main: { 
       expand: true, 
       cwd: '<%= properties.common_libs %>/lib/general/static/js', 
       src: '**/*.js', 
       dest: 'lib' 
      } 
     } 
    }); 

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

另外,如果你希望你的文件“lib/general/static/js/”的目标路径落得太:

module.exports = function(grunt) { 

    grunt.initConfig({ 
     properties: grunt.file.readJSON('properties.json'), 
     copy: { 
      main: { 
       expand: true, 
       cwd: '<%= properties.common_libs %>', 
       src: 'lib/general/static/js/**/*.js', 
       dest: '.' // because src includes 'lib' 
      } 
     } 
    }); 

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

如果你不知道咕噜如何看待您的文件,与grunt -v运行它,它会告诉你。

您可能还想考虑GUN子模块的非Grunt解决方案。

有关特定任务的常量:您可以使用任务(或目标的)options哈希值是什么,以及与模板串访问它:

module.exports = function(grunt) { 

    grunt.initConfig({ 
     properties: grunt.file.readJSON('properties.json'), 
     copy: { 
      options: { 
       foo: 'lib' 
      }, 
      main: { 
       options: { 
        bar: '**/*.js' 
       }, 
       expand: true, 
       cwd: '<%= properties.common_libs %>/<%= copy.options.foo %>/general/static/js', 
       src: '<%= copy.options.main.bar %>', 
       dest: 'lib' 
      } 
     } 
    }); 

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

这是很少超过实际选择其他任何事情,虽然。与真实选项冲突可能发生。您也可以直接使用目标命名空间,直接在main内设置属性。但是,同样有几个属性名称可能会发生冲突。

如果你想覆盖的属性(例如,对于一个发布版本),你可以这样做:

module.exports = function(grunt) { 

    grunt.registerTask('release', function() { 
     grunt.config.set('properties.common_libs', '/usr/lib/shared'); 
    }); 

    grunt.initConfig({ 
     properties: grunt.file.readJSON('properties.json'), 
     copy: { 
      main: { 
       expand: true, 
       cwd: '<%= properties.common_libs %>/lib/general/static/js', 
       src: '**/*.js', 
       dest: 'lib' 
      } 
     } 
    }); 

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

然后,你打电话给你的任务与​​。

编辑

基于更新后的问题,它似乎并不像properties.json文件要使用你的。为什么不直接在Gruntfile中指定属性?

module.exports = function(grunt) { 

    grunt.initConfig({ 
     properties: { 
      base_dir: '../common', 
      base_js_dir: '<%= properties.base_dir %>/lib/general/static/js', 
      base_css_dir: '<%= properties.base_dir %>/lib/general/static/css' 
     }, 
     copy: { 
      main: { 
       expand: true, 
       cwd: '<%= properties.base_js_dir %>', 
       src: '**/*.js', 
       dest: 'lib' 
      } 
     } 
    }); 

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

如果需要,您也可以将此文件与此一起使用。甚至可以将这些属性(使用模板字符串)放入properties.json文件中。最后,它只是让Grunt用模板字符串看到一个对象。以某种方式提供这个由你决定。

+0

谢谢@ simo-kinnunen。感谢您的详细解释和纠正我。我在看的是,有什么我可以从'properties.common_libs'创建另一个简单变量,以便我不需要在'cwd'中指定一个长名称。我想'cwd'采取一个简单的常量,像'properties.common_libs_js'。因为我有许多其他文件需要从相同的'properties.common_libs_js'文件夹中复制。在Ant中,我们从现有的属性创建一个新的属性并使用该快捷方式。我正在寻找一个类似的。我们可以在GruntJS中实现吗? –

+0

更清楚地更新了问题。 –

+0

感谢Simo Kinnunen。 –