Настройка сопоставления имени файла Grunt для файлов с несколькими точками
Я только начал использовать хрюканье и люблю его.
Я продолжаю сталкиваться с проблемой, которая, похоже, может быть довольно распространенной.
Вот. У меня есть файлы, названные так, чтобы слова после точки были чем-то вроде классов. например:
layout.coffee
layout.blog.coffee
layout.site.coffee
Моя задача grunt настроена на просмотр этих файлов и переводит их в js следующим образом:
coffee:
dev:
files: [
expand: true
cwd: "<%= yeoman.app %>"
src: ["**/*.coffee"]
dest: "<%= yeoman.dev %>"
ext: ".js"
]
Проблема, я думаю, заключается в том, что использование ext
делает цель для всех трех файлов. coffee целевым файлом layout.js
, который не является намерением.
Есть ли хороший способ настройки сопоставления файлов grunt для имен файлов с несколькими точками?
Сейчас я должен изменить свое соглашение об именах, чтобы использовать -
вместо .
, что является перетаскиванием: (
Ответы
Ответ 1
Взгляните на раздел "Создание динамического объекта" раздела Настройка задач.
Вместо указания ext
вы можете указать rename
, которая является функцией, которая позволяет создавать собственное сопоставление для имен файлов.
Проблема, с которой вы столкнулись, возникла как проблема в github, и ответ от ворчащих людей заключался в том, что "расширение" файл должен быть всем после первого ".". вместо последнего.
Надеюсь, что вам поможет!
Ответ 2
Обратите внимание, что существует еще одна опция "extDot", которую вы можете использовать, чтобы указать, после какой точки должен применяться внешний (первый или последний):
например.
files: [{
expand: true,
src: ['*.js','!*min.js'],
dest: 'js',
cwd: 'js',
ext: '.min.js',
extDot: 'last'
}]
Ответ 3
Что обходной путь, который я использую в своих проектах:
uglify : {
build : {
src : ['**/*.js', '!*.min.js'],
cwd : 'js/',
dest : 'js/',
expand : true,
rename : function (dest, src) {
var folder = src.substring(0, src.lastIndexOf('/'));
var filename = src.substring(src.lastIndexOf('/'), src.length);
filename = filename.substring(0, filename.lastIndexOf('.'));
return dest + folder + filename + '.min.js';
}
}
}
Когда имя файла похоже на jquery.2.0.3.js, после того, как оно будет указано, будет jquery.2.0.3.min.js.
Ответ 4
Используйте extDot вместо ext:
В Grunt, так вы можете сопоставлять имена файлов с несколькими точками и записывать имена файлов, которые содержат исходную последовательность точек, за исключением расширения файла.
то есть.
/path/to/module.somename.scss -> /path/to/module.somename.css
Пример:
files: [{
expand: true,
src: ['public_html/**/*.scss'],
extDot: 'first',
rename : function (dest, src) {
var _new_ext = 'css';
//Get src filename
src = src.split("/");
var filename = src.pop();
//Apply new extension to filename
var arr = filename.split(".");
arr.pop();
arr.push(_new_ext);
filename = arr.join(".");
dest = dest || src.join("/");
return dest + '/' + filename;
}
}]
Gist: https://gist.github.com/tecfu/f84a65ffa850a0bc2e88