什么 globbing 模式将排除一个子目录,除了它里面的其他两个子目录?

What globbing pattern will exclude a subdirectory except for two other subdirectories inside it?

我正在从 bower 复制 jQueryUI 库。我只想从 "themes" 目录中复制两个主题。我要保留的主题文件夹是 "base" 和 "ui-lightness".

如何使用通配模式完成此操作?

我已经试过了...

gulp.src([
    './bower_components/jqueryui/**',
    '!./bower_components/jqueryui/themes/**(!base/**)'
])

目录结构如下:

├── themes
│   ├── base
│   ├── black-tie
│   ├── blitzer
│   ├── cupertino
│   ├── dark-hive
│   ├── dot-luv
│   ├── eggplant
│   ├── excite-bike
│   ├── flick
│   ├── hot-sneaks
│   ├── humanity
│   ├── le-frog
│   ├── mint-choc
│   ├── overcast
│   ├── pepper-grinder
│   ├── redmond
│   ├── smoothness
│   ├── south-street
│   ├── start
│   ├── sunny
│   ├── swanky-purse
│   ├── trontastic
│   ├── ui-darkness
│   ├── ui-lightness
│   └── vader
└── ui
    ├── i18n
    └── minified

试试这个

  gulp.task('copy_flolder',function(){
  gulp.src(['./bower_components/jqueryui/**', '!./bower_components/jqueryui/themes/**'])
    .pipe(gulp.dest('your dist folder'))
  });
  gulp.task('copy_only_Themes',['copy_flolder'], function() {
     gulp.src(['./bower_components/jqueryui/themes/base/**', './bower_components/jqueryui/themes/ui-lightness/**'])
    .pipe(gulp.dest('your dist folder'))
 });

我只是这样做了。我觉得在一个任务中想出来有点太难了。

var task1 = gulp.src(base + 'jqueryui/*.*').pipe(gulp.dest(target));
var task2 = gulp.src(base + 'jqueryui/ui/**').pipe(gulp.dest(target + '/ui/'));
var task3 = gulp.src(base + 'jqueryui/themes/base/**').pipe(gulp.dest(target + '/themes/base/'));
var task4 = gulp.src(base + 'jqueryui/themes/ui-lightness/**').pipe(gulp.dest(target + '/themes/ui-lightness/'));

return [task1, task2, task3, task4];

Gulp v4.x

当前的 gulp 文档包含一个示例 glob pattern,可以对其进行自定义以满足您的要求。尝试以下操作:

gulp.task('copyfoobar', function() {
   gulp.src([
       'bower_components/jqueryui/**', // [1]
       '!bower_components/jqueryui/themes/**', // [2]
       'bower_components/jqueryui/themes/{base,ui-lightness}/**' // [3]
   ], { base: './' } )
   .pipe(gulp.dest('./dist'));
});

上面显示的 glob Array 执行以下操作:

  • [1] 匹配 bower_components/jqueryui/ 目录下的所有内容。
  • [2] 从通过先前的 glob 模式创建的列表中否定 bower_components/jqueryui/themes 目录(以及其中的所有内容)。
  • [3]bower_components/jqueryui/themes/basebower_components/jqueryui/themes/ui-lightness 目录(以及其中的所有内容)添加回列表。

注意: 上面的解决方案假定 bower_components 目录与 gulpfile.js,目标目录为dist.

结果目录树:

如果您不想将 bower_components 目录添加到您的 target/destination 目录(即 dist),则将 base 选项设置为:

{ base: './bower_components/' }

这将导致如下结果:

.
└── dist
    └── jqueryui
        ├── themes
        │   ├── base
        │   │   └── ...
        │   └── ui-lightness
        │       └── ...
        └── ...

base 选项设置为:

{ base: './' }

结果如下:

.
└── dist
    └── bower_components
        └── jqueryui
            ├── themes
            │   ├── base
            │   │   └── ...
            │   └── ui-lightness
            │       └── ...
            └── ...

Gulp v3.x

不幸的是,上面显示的示例在 Gulp 版本 3.x 中不起作用,因为 Negations (!) 的处理方式不同 - 无论它们在 glob Array 中指定的顺序如何,它们总是最后完成。 issue 837.

中讨论的更多信息

解决方法(对于 v.3.x)是利用 gulp-src-ordered-globs,这将允许您使用与前一个示例相同的 Array globs。

此代码为:

var gulpSrc = require('gulp-src-ordered-globs'); // require the gulp.src() wrapper.

gulp.task('copyfoobar', function() {
   gulpSrc([ // <-- gulpSrc() used instead of gulp.src() 
       'bower_components/jqueryui/**',
       '!bower_components/jqueryui/themes/**',
       'bower_components/jqueryui/themes/{base,ui-lightness}/**'
   ], { base: './' } )
   .pipe(gulp.dest('./dist'));
});