我有一个Angular项目,我用Yeoman来构建。它最初是纯JavaScript和HTML。不久之前,我将JavaScript切换为CoffeeScript,然后将HTML切换为Jade。
我的应用程序运行正常,因为我的模板是Jade,但我无法再成功运行grunt build
。当我尝试时,我明白了:
>> No "concat" targets found.
我没有看到concat
任务的任何定义,所以我认为这是有道理的,但我之前从未有过concat
定义并且它运行良好。
Here is my Gruntfile.coffee
供参考。
此外,这是old, working Gruntfile.coffee
。
非常感谢任何建议。
修改:FWIW,当我将app/index.html
更改为app/index.jade
时,我的问题似乎已经开始了。
答案 0 :(得分:0)
因此,如果我只有RTFM,问题/解决方案就在我的鼻子底下。
有一段时间我跟着tutorial for using Yeoman and Jade together。我跟着它大部分到了这封信,但我错过了这个至关重要的花絮:
上面的示例告诉Jade在
.jade
文件夹中查找<%= yeoman.app %>
个文件,并将它们编译到.tmp
文件夹中。由于watch:livereload
,useminPrepare
和htmlmin
正在<%= yeoman.app %>
中查找您的HTML文件,我们必须更改它们。为此,只需将指向<% yeoman.app %>/*.html
的引用替换为.tmp/*.html
。
我更改了一些引用,摇晃了一些旋钮,现在grunt build
正常工作。这是我Gruntfile.coffee
的工作版本:
# Generated on 2014-11-05 using generator-angular 0.9.8
'use strict'
# # Globbing
# for performance reasons we're only matching one level down:
# 'test/spec/{,*/}*.js'
# use this if you want to recursively match all subfolders:
# 'test/spec/**/*.js'
module.exports = (grunt) ->
# Load grunt tasks automatically
require('load-grunt-tasks') grunt
# Time how long tasks take. Can help when optimizing build times
require('time-grunt') grunt
# Configurable paths for the application
appConfig =
app: require('./bower.json').appPath or 'app'
dist: '../public'
modRewrite = require('connect-modrewrite')
# Define the configuration for all the tasks
grunt.initConfig
yeoman: appConfig
watch:
bower:
files: [ 'bower.json' ]
tasks: [ 'wiredep' ]
js:
files: [ '<%= yeoman.app %>/scripts/{,*/}*.js' ]
tasks: [ 'newer:jshint:all' ]
options: livereload: '<%= connect.options.livereload %>'
jade:
files: ['<%= yeoman.app %>/**/*.jade'],
tasks: ['jade']
coffee:
files: [ '<%= yeoman.app %>/scripts/{,*/}*.{coffee,litcoffee,coffee.md}' ]
tasks: [ 'newer:coffee:dist']
jsTest:
files: [ 'test/spec/{,*/}*.js' ]
tasks: [
'newer:jshint:test'
'karma'
]
compass:
files: [ '<%= yeoman.app %>/styles/{,*/}*.{scss,sass}' ]
tasks: [
'compass:server'
'autoprefixer'
]
gruntfile: files: [ 'Gruntfile.js' ]
livereload:
options: livereload: '<%= connect.options.livereload %>'
files: [
'.tmp/{,*/}*.html'
'.tmp/styles/{,*/}*.css'
'<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
]
connect:
options:
port: 9000
hostname: 'localhost'
livereload: 35729
proxies: [ {
context: '/api'
host: 'localhost'
port: 3000
} ]
livereload: options:
open: true
middleware: (connect, options) ->
if !Array.isArray(options.base)
options.base = [ options.base ]
middlewares = [
modRewrite([ '!/api|/assets|\\..+$ /index.html' ])
require('grunt-connect-proxy/lib/utils').proxyRequest
connect.static('.tmp')
connect().use('/bower_components', connect.static('./bower_components'))
connect.static(appConfig.app)
]
# Make directory browse-able.
directory = options.directory or options.base[options.base.length - 1]
middlewares.push connect.directory(directory)
middlewares
test: options:
port: 9001
middleware: (connect) ->
[
connect.static('.tmp')
connect.static('test')
connect().use('/bower_components', connect.static('./bower_components'))
connect.static(appConfig.app)
]
dist: options:
open: true
base: '<%= yeoman.dist %>'
jshint:
options:
jshintrc: '.jshintrc'
reporter: require('jshint-stylish')
all: src: [
'Gruntfile.js'
'<%= yeoman.app %>/scripts/{,*/}*.js'
]
test:
options: jshintrc: 'test/.jshintrc'
src: [ 'test/spec/{,*/}*.js' ]
clean:
dist: files: [ {
dot: true
src: [
'.tmp'
'<%= yeoman.dist %>/{,*/}*'
'!<%= yeoman.dist %>/.git*'
]
} ]
server: '.tmp'
autoprefixer:
options: browsers: [ 'last 1 version' ]
dist: files: [ {
expand: true
cwd: '.tmp/styles/'
src: '{,*/}*.css'
dest: '.tmp/styles/'
} ]
wiredep:
app:
src: [ '<%= yeoman.app %>/index.jade' ]
ignorePath: /\.\.\//
sass:
src: [ '<%= yeoman.app %>/styles/{,*/}*.{scss,sass}' ]
ignorePath: /(\.\.\/){1,2}bower_components\//
jade:
dist:
options:
pretty: true
data:
debug: true
files: [
expand: true
cwd: '<%= yeoman.app %>'
dest: '.tmp'
src: '**/*.jade'
ext: '.html'
]
coffee:
options:
sourceMap: true
bare: true
sourceRoot: ''
dist:
files: [
expand: true
cwd: '<%= yeoman.app %>/scripts'
src: '{,*/}*.coffee'
dest: '.tmp/scripts'
ext: '.js'
]
test:
files: [
expand: true
cwd: 'test/spec'
src: '{,*/}*.coffee'
dest: '.tmp/spec'
ext: '.js'
]
compass:
options:
sassDir: '<%= yeoman.app %>/styles'
cssDir: '.tmp/styles'
generatedImagesDir: '.tmp/images/generated'
imagesDir: '<%= yeoman.app %>/images'
javascriptsDir: '<%= yeoman.app %>/scripts'
fontsDir: '<%= yeoman.app %>/styles/fonts'
importPath: './bower_components'
httpImagesPath: '/images'
httpGeneratedImagesPath: '/images/generated'
httpFontsPath: '/styles/fonts'
relativeAssets: false
assetCacheBuster: false
raw: 'Sass::Script::Number.precision = 10\n'
dist: options: generatedImagesDir: '<%= yeoman.dist %>/images/generated'
server: options: debugInfo: true
filerev: dist: src: [
'<%= yeoman.dist %>/scripts/{,*/}*.js'
'<%= yeoman.dist %>/styles/{,*/}*.css'
'<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
'<%= yeoman.dist %>/styles/fonts/*'
]
useminPrepare:
html: '.tmp/index.html'
options:
dest: '<%= yeoman.dist %>'
flow: html:
steps:
js: [
'concat'
'uglifyjs'
]
css: [ 'cssmin' ]
post: {}
usemin:
html: [ '.tmp/**/*.html' ]
css: [ '<%= yeoman.dist %>/styles/{,*/}*.css' ]
options: assetsDirs: [
'<%= yeoman.dist %>'
'<%= yeoman.dist %>/images'
]
imagemin: dist: files: [ {
expand: true
cwd: '<%= yeoman.app %>/images'
src: '{,*/}*.{png,jpg,jpeg,gif}'
dest: '<%= yeoman.dist %>/images'
} ]
svgmin: dist: files: [ {
expand: true
cwd: '<%= yeoman.app %>/images'
src: '{,*/}*.svg'
dest: '<%= yeoman.dist %>/images'
} ]
htmlmin: dist:
options:
collapseWhitespace: true
conservativeCollapse: true
collapseBooleanAttributes: true
removeCommentsFromCDATA: true
removeOptionalTags: true
files: [ {
expand: true
cwd: '.tmp'
src: [
'*.html'
'**/*.html'
]
dest: '<%= yeoman.dist %>'
} ]
ngAnnotate: dist: files: [ {
expand: true
cwd: '.tmp/concat/scripts'
src: [
'*.js'
'!oldieshim.js'
]
dest: '.tmp/concat/scripts'
} ]
cdnify: dist: html: [ '<%= yeoman.dist %>/*.html' ]
copy:
dist: files: [
{
expand: true
dot: true
cwd: '<%= yeoman.app %>'
dest: '<%= yeoman.dist %>'
src: [
'*.{ico,png,txt}'
'.htaccess'
'*.html'
'**/*.html'
'images/{,*/}*.{webp}'
'fonts/*'
]
}
{
expand: true
cwd: '.tmp/images'
dest: '<%= yeoman.dist %>/images'
src: [ 'generated/*' ]
}
{
expand: true
cwd: '.'
src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*'
dest: '<%= yeoman.dist %>'
}
]
styles:
expand: true
cwd: '<%= yeoman.app %>/styles'
dest: '.tmp/styles/'
src: '{,*/}*.css'
concurrent:
server: [
'jade:dist'
'coffee:dist'
'compass:server'
]
test: [ 'compass' ]
dist: [
'jade'
'coffee'
'compass:dist'
'imagemin'
'svgmin'
]
karma: unit:
configFile: 'test/karma.conf.js'
singleRun: true
grunt.registerTask 'serve', 'Compile then start a connect web server', (target) ->
if target == 'dist'
return grunt.task.run([
'build'
'connect:dist:keepalive'
])
grunt.task.run [
'clean:server'
'wiredep'
'railsServer:development'
'concurrent:server'
'autoprefixer'
'configureProxies'
'connect:livereload'
'watch'
]
return
grunt.registerTask 'server', 'DEPRECATED TASK. Use the "serve" task instead', (target) ->
grunt.log.warn 'The `server` task has been deprecated. Use `grunt serve` to start a server.'
grunt.task.run [ 'serve:' + target ]
return
grunt.registerTask 'test', [
'clean:server'
'concurrent:test'
'autoprefixer'
'connect:test'
'karma'
]
grunt.registerTask 'build', [
'clean:dist'
'jade'
'coffee'
'wiredep'
'useminPrepare'
'concurrent:dist'
'autoprefixer'
'concat'
'ngAnnotate'
'copy:dist'
'cdnify'
'cssmin'
'uglify'
'filerev'
'usemin'
'htmlmin'
]
grunt.registerTask 'default', [
'newer:jshint'
'test'
'build'
]
grunt.registerTask 'heroku:production', 'build'
grunt.loadNpmTasks 'grunt-contrib-jade'
grunt.loadNpmTasks 'grunt-contrib-coffee'
grunt.loadNpmTasks 'grunt-connect-proxy'
grunt.loadNpmTasks 'grunt-rails-server'