如何将 globbed gulp.src 文件移动到嵌套的 gulp.dest 文件夹中

How to move globbed gulp.src files into a nested gulp.dest folder

问题第 1 部分:输出到嵌套的动态文件夹

我使用 Gulp.js 进行 图形电子邮件开发。 我的雇主正在切换到需要我们的电子邮件的不同营销平台模板位于不同的文件夹结构中。 当 gulp.src 使用 globbing 时,我无法输出到嵌套文件夹。 非常感谢你的帮助!

这是 gulp.src 文件夹的简化示例:

build/template1/template1.html
build/template2/template2.html
build/template3/template4.html
build/template4/template4.html

这是 gulp.src 文件夹的简化示例:

build/template1/theme/html/template1.html
build/template2/theme/html/template2.html
build/template3/theme/html/template4.html
build/template4/theme/html/template4.html

我想为动态模板文件夹做一些类似通配符的事情...

gulp.task('moveFile', function(){
  return gulp.src('./build/*/*.html')
  .pipe(gulp.dest('./build/*/theme/html'));
});

... 但是 globbing 仅在 gulp.src 中有效。 如何在使用全局 gulp.src 时输出到动态文件夹? 我能得到的最接近的是将 /theme 文件夹与模板文件夹放在同一级别,而不是在里面随心所欲。

感谢您的帮助!

问题第 2 部分:将*重命名的文件*输出到嵌套的动态文件夹

Mark 回答了我的问题(感谢@Mark!),但我过度简化了我的用例,所以我添加了第 2 部分。

除了嵌套文件外,我还需要重命名它。 (我最初让这部分工作,但无法让这两个部分一起工作。)参考 gulp-rename 文档,我进行了 3 次不同的尝试。它是如此接近,但我会感谢更多的帮助。 :-)

// ATTEMPT 1: Using gulp-rename mutating function method
gulp.task('createTwig', function(){
  return gulp.src('./build/*/*.html')
    .pipe(rename(
      function (path) {
        path.basename = "email";
        path.extname = ".html.twig";
      },
      function (file) {
        console.log(file.dirname);
        file.dirname = nodePath.join(file.dirname, 'theme/html');
      }
    ))
    .pipe(gulp.dest('./build/'));
});

// ATTEMPT 2: Using gulp-rename fixed object method
gulp.task('createTwig', function(){
  return gulp.src('./build/*/*.html', { base: process.cwd() })
    .pipe(rename(
      {
        basename: "email",
        extname: ".html.twig"
      },
      function (file) {
        console.log(file.dirname);
        file.dirname = nodePath.join(file.dirname, 'theme/html');
      }
    ))
    .pipe(gulp.dest('./build/'));
});

// ATTEMPT 3: Using gulp-rename mutating function method
gulp.task('createTwig', function(){
  return gulp.src('./build/*/*.html')
    .pipe(rename(
      function (path, file) {
        path.basename = "email";
        path.extname = ".html.twig";
        console.log(file.dirname);
        file.dirname = nodePath.join(file.dirname, 'theme/html');
      }
    ))
    .pipe(gulp.dest('./build/'));
});

这个有效:

const rename = require("gulp-rename");
const path = require("path");


gulp.task('moveFile', function(){
  return gulp.src(['build/**/*.html'])

    .pipe(rename(function (file) {
      console.log(file.dirname);
      file.dirname = path.join(file.dirname, 'theme/html');
    }))

    .pipe(gulp.dest('build'))   // build/template1/theme/html
});

我尝试了几种方法,包括尝试 base 选项和 gulp-flatten 以及使用 gulp.dest 中的函数,但这是最简单的方法。


问题第 2 部分:

gulp.task('createTwig', function(){
  return gulp.src(['build/**/*.html'])

  .pipe(rename(function (file) {

    file.basename = "email";
    file.extname = ".html.twig";
  
    file.dirname = path.join(file.dirname, 'theme/html');
  }))

  .pipe(gulp.dest('build'))   // build/template1/theme/html
});

path.basename/extname 只是“吸气剂”,您不能设置这些值。