【问题标题】:What globbing pattern will exclude a subdirectory except for two other subdirectories inside it?除了其中的两个其他子目录之外,什么 globbing 模式将排除子目录?
【发布时间】:2017-03-13 22:48:49
【问题描述】:

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

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

我试过这个...

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

【问题讨论】:

    标签: jquery-ui gulp gruntjs glob


    【解决方案1】:

    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] 否定 bower_components/jqueryui/themes 目录(以及其中的所有内容),从通过之前的 glob 模式创建的列表中。
    • [3]bower_components/jqueryui/themes/basebower_components/jqueryui/themes/ui-lightness 目录(以及其中的所有内容)添加回列表。

    注意: 上述解决方案假设bower_components 目录与您的gulpfile.js 位于同一目录,目标目录为dist

    结果目录树:

    如果您不希望将bower_components 目录添加到您的目标/目标目录(即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 中不起作用,因为 否定 (!) 的处理方式不同 - 它们总是最后完成,无论它们在 glob Array 中指定的顺序。在issue 837 中讨论的更多信息。

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

    代码如下:

    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'));
    });
    

    【讨论】:

    • 哇,好答案!这正是我所需要的。
    【解决方案2】:

    我只是这样做了。我认为在一项任务中弄清楚它有点太难了。

    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];
    

    【讨论】:

      【解决方案3】:

      试试这个

        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'))
       });
      

      【讨论】:

      • 我仍然想复制'./bower_components/jqueryui/**' 下的所有内容。但是在themes文件夹中我只想复制这两个主题。
      • 所以你可以做的是创建两个任务,因为第一个任务将复制 ./bower_components/jqueryui/** 期望 ./bower_components/jqueryui/themes/** 中的所有内容,然后我的上述任务将完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多