0

我正在使用 gruntjs 构建我的 js 应用程序。我的 grunt 文件设置为运行两个单独的构建,其中 80% 的代码对于两者都是相同的,并且根据构建我们包含其他文件并排除一些文件。

我有 grunt setup 可以正确运行两个不同的构建,除非我不能告诉 grunt-regard 运行多次。

regarde:
  coffeeScripts:
    files: ['app/scripts/kiosk/*.coffee', 'app/scripts/*.coffee'],
    tasks: ['coffee:compileKiosk', 'livereload']
  stylusScripts:
    files: ['app/css/kiosk/*.styl', 'app/css/*.styl'],
    tasks: ['stylus:compileKiosk', 'livereload']
  coffeeScriptsWeb:
    files: ['app/scripts/web/*.coffee', app/scripts/*.coffee],
    tasks: ['coffee:compileWeb', 'livereload']
  stylusScriptsWeb:
    files: ['app/css/web/*.styl', 'app/css/*.styl],
    tasks: ['stylus:compileWeb', 'livereload']

我希望能够执行类似于以下任务的操作,但只有第一个受关注的任务运行,第二个被忽略。

grunt.registerTask 'watchKiosk', ['livereload-start', 'regarde:coffeeScripts', 'regarde:stylusScripts']
grunt.registerTask 'watchWeb', ['livereload-start', 'regarde:coffeeScriptsWeb', 'regarde:stylusScriptsWeb']

我的文件夹结构看起来像

app       (application root)
  scripts (contains common script files)
    kiosk (contains script files only for kiosk build)
    web   (contains script files only for web build)
  css     (contains common css files)
    kiosk (contains css files only for kiosk build)
    web   (contains css files only for web build)

理想情况下,在使用 web 构建时,我不想在文件更改时重新编译所有 kiosk 文件和 web 文件。

有什么方法可以设置 grunt 以定义多个相关任务并运行我想要为我正在处理的构建的特定任务?

如果我运行这些 grunt 任务,手表可以工作,但会重建不属于我正在使用的特定构建的文件

grunt.registerTask 'watchKiosk', ['livereload-start', 'regarde']
grunt.registerTask 'watchWeb', ['livereload-start', 'regarde']
4

1 回答 1

0

感谢asgoth的链接,从链接的答案中,我能够找到一种方法来做到这一点。这可能不是最好的方法,但它确实有效。

我为我的相关任务添加了两种不同的配置(一种用于 kiosk 构建,一种用于 web 构建)到 grunt 文件中:

regardeKiosk:
  coffeeScripts:
    files: ['app/scripts/kiosk/*.coffee', 'app/scripts/*.coffee'],
    tasks: ['coffee:compileKiosk', 'livereload']
  stylusScripts:
    files: ['app/css/kiosk/*.styl', 'app/css/*.styl'],
    tasks: ['stylus:compileKiosk', 'livereload']

regardeWeb:
  coffeeScriptsWeb:
    files: ['app/scripts/web/*.coffee', app/scripts/*.coffee],
    tasks: ['coffee:compileWeb', 'livereload']
  stylusScriptsWeb:
    files: ['app/css/web/*.styl', 'app/css/*.styl],
    tasks: ['stylus:compileWeb', 'livereload']

然后我创建了一个多任务,在开始关注任务之前选择正确的配置并更新相关配置。

#startWatch config
startWatch:
  web: 'Web'
  kiosk: 'Kiosk'

grunt.registerMultiTask 'startWatch', 'refreshing the changed file(s)', () ->
  #read regarde config and regarde template config. @data comes from startWatch config
  regardeConfig = grunt.config('regarde')
  correctConfig = grunt.config('regarde' + @data)

  #replace regarde config with the correct config
  grunt.config('regarde', correctConfig)

  #run regarde task
  grunt.task.run('regarde')

然后我可以定义我的两个 grunt 任务并根据构建选择要运行的任务

grunt.registerTask 'watchKiosk', ['livereload-start', 'startWatch:kiosk']
grunt.registerTask 'watchWeb', ['livereload-start', 'startWatch:web']
于 2013-04-12T22:28:15.113 回答