Gulp - 处理多个主题和文件夹

2024-04-11

我正在努力创造一个终极gulpfile我们可以在我们的大型网站之一上使用它(一个具有多个主题,具体取决于您所在网站的部分)。我试图让它只运行它需要运行的进程,而不是重新编译所有内容。

让我准确地布局我想要实现的目标:

文件夹结构

src/
    master-theme/
        css/
            style.scss
            partials/
                _a.scss
                _b.scss
        img/
            a.jpg
            b.jpg

    sub-theme/
        css/
            style.scss
            partials/
                _c.scss
                _d.scss
        img/
            c.png
            d.jpg

我希望这些文件被压缩/编译并最终位于具有相同文件夹结构的目标文件夹中(只需替换src with dest在你的脑海)

问题

目前我可以让它做我想做的事 - 但 gulpfile 会编译和压缩一切。例如。如果我添加图像sub-theme/img它将对所有“主题”运行图像压缩。我在用gulp-changed但这仍然意味着它正在查看网站上的所有图像。

sass 也是如此 - 如果我更新_c.scss,但是主 css 和子主题 css 被编译,这显然是不希望的。

目前的解决方案

我现在真的没有。现在我正在使用gulp-file-tree生成文件夹结构的 json 文件,然后每当文件更改时,循环遍历该文件 有一个函数(我知道这很糟糕 - 但目前有效的解决方案)

var tree = require('./build/tree.json');
var children = tree.children;

for (var i = children.length - 1; i >= 0; i--) {

    var child = children[i];

    if(child.isDirectory)
        task(child)
}

There task()是传入的 gulp 任务(例如 Sass 编译)

文件夹结构不值得讨论 - 我不希望这变成“以不同方式构建文件”之类的事情。还有其他几个与这个问题无关的因素来解释为什么我们会这样(抱歉我不得不这么说......)

我愿意尝试任何事情,因为我已经盯着这个文件好几天了。我尝试运行的任务是:

  • Sass 编译
  • 精灵生成
  • SVG 精灵到 PNG 精灵
  • 图像压缩
  • JavaScript 压缩

在此先感谢您的帮助。如果找到解决方案,我会写一篇适当的文章,这样其他人就不会感受到我的痛苦......


我正在做几乎同样的事情,而且我想我已经成功了。

gulpfile.js:

var gulp = require('gulp'),
    debug = require('gulp-debug'),
    merge = require('merge-stream'),
    sass = require('gulp-sass'),
    less = require('gulp-less'),
    changed = require('gulp-changed'),
    imagemin = require('gulp-imagemin'),
    prefix = require('gulp-autoprefixer'),
    minifyCSS = require('gulp-minify-css'),
    browserSync = require('browser-sync'),
    reload = browserSync.reload,
    path = require('path'),
    glob = require('glob');

// Log errors to the console
function errorHandler(error) {
    console.log(error.toString());
    this.emit('end');
}

function processThemeFolder(src) {
    function debugTheme(type) {
        return debug({ title: 'theme ' + theme + ' ' + type});
    }

    var theme = path.basename(src);
    var dest = 'public/themes/' + theme;

    return merge(
        gulp
            .src([src + '/sass/**/*.scss'])
            .pipe(changed(dest + '/css', { extension: '.css' }))
            .pipe(debugTheme('sass'))
            .pipe(sass())
            .pipe(minifyCSS())
            .pipe(gulp.dest(dest + '/css')),
        gulp
            .src([src + '/less/**/*.less'])
            .pipe(changed(dest + '/css', { extension: '.css' }))
            .pipe(debugTheme('less'))
            .pipe(less())
            .pipe(minifyCSS())
            .pipe(gulp.dest(dest + '/css')),
        gulp
            .src([src + '/js/**/*.js'])
            .pipe(changed(dest + '/js'))
            .pipe(debugTheme('js'))
            .pipe(uglify())
            .pipe(gulp.dest(dest + '/js')),
        gulp
            .src([src + '/img/**/*.{png,jpg,gif}'])
            .pipe(changed(dest + '/img'))
            .pipe(debugTheme('img'))
            .pipe(imagemin())
            .pipe(gulp.dest(dest + '/img'))
    ).on('change', reload);
}

gulp.task('themes', function() {
    var srcThemes = glob.sync('resources/themes/*');
    return merge(srcThemes.map(processThemeFolder));
});

// ...

这里的关键是使用吞咽改变 https://github.com/sindresorhus/gulp-changed仅传递已更改的文件。剩下的就是上面的奶油。

编译流都显示一条调试行,详细说明哪些文件将进入流。当流发生变化时, browserSync 被通知使用流式传输(如果可能)重新加载浏览器。主题任务只完成一次 它的所有编译流都已完成,并且只有当所有主题都完成时,总体主题任务才会被标记为已完成。

主题的源文件存储在resources/themes/themename中,并将其输出写入public/themes/themename。

这对我来说非常有效,YMMV。 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gulp - 处理多个主题和文件夹 的相关文章

随机推荐

  • Spyder + Python 3.5 - 如何调试内核死机,重新启动?

    我第一次致力于实现一个非常简单的 GUIPyQt5 其中嵌入了一个matplotlib情节和几个交互按钮 我真的不知道如何使用类 所以我犯了很多错误 即即使功能很简单 我也必须在小的更正和验证之间进行大量迭代 出于某种原因 我想调试 但是
  • 问题:gcc 从我的 C++ 生成的程序集

    编译这段代码 int main return 0 using gcc S filename cpp 生成此程序集 file heloworld cpp text globl main type main function main LFB0
  • 带 StickyHeader 的 Sliver 内的 TabBarView

    到目前为止 我已经使用 CustomScrollView 和 Sticky Header 制作了这个布局 https i stack imgur com piwya jpg https i stack imgur com piwya jpg
  • 在 OpenCart 3 中禁用模板缓存以进行开发

    我正在 OpenCart 3 中的主题模板中进行更改 由于模板缓存 我每次都必须在 storage cache 目录下清除缓存 在开发过程中频繁工作和预览更改是非常烦人的 请提供一些解决方案 我们如何根据生产和开发环境配置缓存 注 我已经在
  • 检测开始和停止编辑 UITextView

    如何在进入 UITextView 用户点击以编辑它 和离开视图 用户点击以离开它 时调用一些代码 感谢任何帮助 http developer apple com library ios documentation uikit referen
  • 一台机器上有多个 gitolite 用户

    我已经在远程计算机上设置了 gitolite 并从本地配置了它 我不想让我的活动显示为 admin 并创建用户和密钥 noah 为 noah 创建存储库后 我被拒绝访问 我相信 因为我仍然是 管理员 所以我在一台机器上有两个帐户 我该如何切
  • 如何对每个 WCF 调用进行身份验证和授权?

    我有 WPF 客户端使用 IIS 中托管的 WCF 服务 对于身份验证 我正在考虑证书或用户名身份验证 客户端调用 WCF 中的几个方法并传递一些消息 对于 WCF 接到的每个电话 我 想要验证用户身份 要将消息放入数据库 我必须知道调用者
  • 如何自定义NSToolbar的上下文菜单?

    我需要从右键单击上下文菜单中删除一些项目 但工具栏不包含用于访问 toolbarView 的公共 API 是否可以在不使用私有 API 的情况下自定义菜单 您可以在创建工具栏时访问和修改工具栏上下文菜单 即在 awakeFromNib NS
  • 支持 DB2 和 IBM Cloud php 应用程序的 github php buildpack

    我们在 IBM Cloud 上有一个连接到 DB2 实例 也在 IBM Cloud 上 的 PHP 应用程序 该应用程序已经完美运行了 2 年 截至 9 月 16 日 我们使用构建包 https github com ibmdb php b
  • RevealViewController() 总是返回 nil

    我遇到了一些麻烦revealViewController在 Xcode 7 2 和 iOS 9 2 中 我的应用程序从嵌入导航控制器中的视图控制器开始 以执行登录 登录后 或者如果存在登录令牌 我会使用以下代码跳转到嵌入导航控制器中的另一个
  • 有哪些不同类型的封装?

    有哪些不同类型的封装 我是否认为这基本上指的是核心面向对象概念 例如抽象 多态性和继承 我对封装的理解是 它是一种隐藏数据 功能的方法 但我从未真正考虑过多态性或继承是封装的一种形式 尽管我可以看到多态性如何被视为封装 因为它可以隐藏您的对
  • 如何在 protobuf-csharp-port 和 protobuf-net 之间进行选择

    我最近不得不寻找最初由 Google 开发的 Protocol Buffers 库的 C 移植 你猜怎么着 我在这里发现了两个由两个非常知名的人拥有的项目 protobuf csharp 端口 http code google com p
  • 比较两个数据库的结构?

    我想问是否可以比较两个巨大数据库的完整数据库结构 我们有两个数据库 一个是开发数据库 另一个是生产数据库 有时我会忘记在发布部分代码之前对生产数据库进行更改 这会导致生产数据库不具有相同的结构 因此如果我们发布某些内容 就会出现一些错误 有
  • 如何将我的 React-App 部署到 github 用户页面

    我一整天都在努力将我的 React 应用程序部署到 Github 用户页面 例如https mygitname github io http 而不是 Github 页面 例如https mygitname github com mysite
  • 从动态复选框列表中获取值

    See my html
  • 错误 TypeError:无法读取 Angular 7 拖放中未定义的属性“长度”

    我只是想在 Angular 7 的帮助下创建拖放组件DragDropModule from angular cdk drag drop 但我总是收到如下错误 HomeComponent html 14 ERROR TypeError Can
  • 如何创建带有括号和参数的自定义 jquery 函数

    我知道我的问题需要更多澄清 所以让我解释一下 当我访问 fn extend 的 jquery api 文档时 我个人对创建如下所示的自定义 jquery 函数是多么容易感到震惊 input type checkbox check 链接在这里
  • 如何使用react.js上传Excel工作表文件并将数据显示到表格

    我是 React JS 的新手 我正在尝试使用react js上传Excel工作表文件并将数据显示到表格中 我有 链接中的部分参考 但并不完整 请帮忙解决一下 从 Excel 导入数据并在 React 组件中显示 https stackov
  • MVC 3 应用程序中的自定义 Http 处理程序

    我正在使用 Http 处理程序来本地化应用程序中使用的 javascript 文件 看 在 ASP NET 中本地化 JavaScript 文件中的文本 http madskristensen net post Localize text
  • Gulp - 处理多个主题和文件夹

    我正在努力创造一个终极gulpfile我们可以在我们的大型网站之一上使用它 一个具有多个主题 具体取决于您所在网站的部分 我试图让它只运行它需要运行的进程 而不是重新编译所有内容 让我准确地布局我想要实现的目标 文件夹结构 src mast