Gulp - скопировать и переименовать файл

Я очень новичок в Gulp. В основном я пытаюсь найти измененный файл JavaScript, а затем сделать его новую копию с новым именем. (в конце концов там будет какая-то обработка, но Рим не за один день строился).

Моя (наивная) попытка такова:

gulp.task('default', function() {

    return gulp.watch('../**/**.js', function(obj){
        gulp.src(obj.path)
            .pipe(gulp.dest('foobar.js'));
    });

});

Это берет измененный файл и успешно копирует его в папку, которая теперь называется foobar.js. Есть ли что-нибудь простое, что я могу заменить gulp.dest('foobar.js'), чтобы просто скопировать и переименовать файл src на место?


РЕДАКТИРОВАТЬ

Под копией на месте я имею в виду, что хочу взять измененный файл и сделать его копию прямо где он сейчас находится с новым именем. Эквивалент щелчка по файлу (в Windows) и нажатия control-c control-v, а затем переименования полученного файла.


person Adam Rackis    schedule 18.02.2015    source источник


Ответы (2)


Я не уверен на 100%, что вы имеете в виду под

скопировать и переименовать... на место

Но, основываясь на вашем текущем коде, если вы просто хотите:

  1. Просмотрите все .js файлы в родительском каталоге и
  2. Скопируйте их в cwd (текущий рабочий каталог) и
  3. Назовите все копии, независимо от исходного файла, одно и то же

Затем вы можете использовать gulp-rename, чтобы сделать это:

var gulp = require('gulp');
var rename = require('gulp-rename');

gulp.task('default', function() {
  return gulp.watch('../**/**.js', function(obj) {
    gulp.src(obj.path)
      .pipe(rename('newFileName.js'))
      .pipe(gulp.dest('.'));
  });
});

В этом случае имя выходного файла newFileName.js

Чтобы использовать модуль, вам необходимо установить пакет gulp-rename с npm (то есть: npm install gulp-rename).

Дополнительные примеры доступны на странице сведений о пакете на сайте npm @ https://www.npmjs.com/package/gulp-rename#usage

person knksmith57    schedule 18.02.2015
comment
+1 - большое спасибо. Прошу прощения за неясный вопрос. Я отредактировал свой вопрос, чтобы, надеюсь, уточнить. - person Adam Rackis; 19.02.2015
comment
@AdamRackis, используя ваш обновленный код, я не могу воспроизвести проблему. Вы на 100% уверены, что изменение происходит не в скопированном файле, а в исходном файле? Если вы console.log(obj.path) перед строкой gulp.src, можете ли вы убедиться, что именно исходный файл вызывает обратный вызов задачи наблюдения? - person knksmith57; 19.02.2015
comment
Ах, если подумать, изменение файла перезаписывает предыдущий измененный файл, который запускает новый файл. Большое спасибо за помощь. Я принесу вам еще несколько голосов :) - person Adam Rackis; 19.02.2015
comment
Ах! Это имеет смысл. Рад, что смог помочь - спасибо за подсказки :) - person knksmith57; 19.02.2015
comment
Приятно видеть, что спустя 2 года на этом сайте вы наконец нашли ответ на вопрос! Спасибо еще раз :) - person Adam Rackis; 19.02.2015
comment
Нет ли способа сделать это без установки нового пакета? - person stallingOne; 28.03.2018

Это было не очень хорошо, но, в конце концов, это то, что я хочу (с некоторой транспиляцией ES6 посередине).

Ключ, по-видимому, является объектом параметров с базовым свойством в вызове src. Кажется, это то, что нужно для сохранения пути к текущему файлу при вызове dest.

var gulp = require('gulp'),
    rename = require('gulp-rename'),
    babel = require('gulp-babel');

gulp.task('default', function() {
    return gulp.watch('../**/$**.js', function(obj){
        if (obj.type === 'changed') {
            gulp.src(obj.path, { base: './' })
                .pipe(babel())
                .pipe(rename(function (path) {
                    path.basename = path.basename.replace('$', '');
                }))
                .pipe(gulp.dest(''));
        }
    });
});
person Adam Rackis    schedule 18.02.2015