【问题标题】:Gulp destination relative to source相对于源的 Gulp 目标
【发布时间】:2017-06-06 09:18:49
【问题描述】:

我正在尝试解析所有文件夹中的所有 SCSS 文件,并且我需要它们位于原始文件的相对目标中。

这是我想要的文件夹结构的表示(基本上,scss文件夹中的scss文件需要保存为原始scss文件夹旁边的css文件夹中的css文件)和流氓scss文件(不在scss文件夹中)应该有css文件保存在与 scss 文件相同的目标位置。

html
│   README.md
│
└───app_abc
│   │   index.php
│   │   something_else.php
│   │
│   └───styles
│       └───scss
│       │       _mixins.scss
│       │       layout.scss
│       │       content.scss
│       │
│       └───css
│               layout.css
│               content.css
│   
└───app_def
│   │   index.php
│   │   something_else.php
│   │   rogue.scss
│   │   rogue.css
│   │
│   └───styles
│       └───scss
│       │       _mixins.scss
│       │       layout.scss
│       │       content.scss
│       │
│       └───css
│               layout.css
│               content.css
└───app_ghi
    ...

我昨天和今天尝试玩了几个小时,但无济于事。我可以在同一个文件夹中创建 CSS 文件,但这不是我想要的。

这是我的 gulpfile.js(里面有很多“调试”的东西)。

var gulp = require('gulp'),
    sass = require('gulp-sass'),
    path = require('path'),
    through = require('through2');


const debug = require('gulp-debug');


const sassFiles = './html/**/[^_]*.scss';

function parsePath() {
    return through.obj(function (file, enc, cb) {
        console.log(file.base);
        console.log(file.cwd);
        console.log(file.path);
        console.log(file.name);
        console.log(path.relative(file.cwd, file.path));
        console.log(path.relative(path.join(file.cwd, file.base), file.path))
        console.log(path.relative(path.join(file.cwd, file.base), file.path).replace('scss', 'css'))
        console.log(file.path.replace(file.name, '').replace('scss', 'css'))
        cb();
    });
}

gulp.task('sass', function(){
  return gulp.src(sassFiles)
    .pipe(debug({title: 'test:', minimal: false}))
    .pipe(parsePath())
    .pipe(sass().on('error', sass.logError))
    //.pipe(gulp.dest('css'))
    //.pipe(gulp.dest(function (file) {
        //return file.path.replace('scss', 'css');
        //return path.relative(path.join(file.cwd, file.base), file.path).replace('scss', 'css');
    //}))
    .pipe(gulp.dest(function (file) {
        console.log(file.base);
        return file.base;
    }));
});

gulp.task('watch', ['sass'], function(){
  gulp.watch(sassFiles, ['sass']); 
})

感谢您的帮助。

Ps.:无论如何,我在 Debian Jessie x64 上运行。

Pps.:我用谷歌搜索并阅读了很多 stackoverflow 线程,但没有一个能解决我的问题(好吧,如果有,它对我不起作用)。

【问题讨论】:

  • 您确定要单独的 .css 文件,而不是将所有 scss 文件编译成一个 css?我理解对了吗?例如,您有 2 个应用程序文件夹,其中 SCSS 文件位于一个文件夹中,CSS 位于另一个文件夹中。现在你想简单地编译它们?为什么不在每个应用程序文件夹中执行这个 gulp 任务?第一步会更容易
  • @MarkusG。是的,我敢肯定。我们不会在每个页面上都包含所有文件,并且我们有我们的自定义压缩器,它还将特定页面(模块)上使用的所有文件合并到一个文件中。有超过 2 个应用程序文件夹,并且并非所有文件夹都有任何前端(所以根本没有 scss 文件)。我需要它灵活,所以如果我们添加新的应用程序文件夹,它会自动编译它们。问题是,我的老板喜欢在服务器上实时编辑文件,所以我需要一些能够自动编译 scss 文件并将其保存为 css 的东西,如果他决定自动使用我的 sass 而不用我知道他做了什么...跨度>
  • 关于多个 css 文件,你想多了。每个页面都有一个捆绑包会扼杀优化,因为您会迫使用户从稍微不同的捆绑包中重新下载相同的 css。相反,您应该拥有一个第三方捆绑包(引导程序、插件等)和一个符合您风格的捆绑包。这样,浏览器缓存将加载 2 个文件,然后无需再次下载它们。之后的编译流程就是个笑话!
  • @EmileBergeron 我忘了添加,我无法更改文件夹结构。我不负责它,我永远不会。我正在尝试为我们公司带来一些新技术。相信我,您不想看到我们的工作流程。这就是为什么我需要我所要求的。如果不可能,那么这家公司可能永远不会切换到 SASS。 Ps.:我们的缩小器以简单的方式工作,您可以告诉它缩小文件并将其合并到站点范围的 css 中,将其合并到具有自定义名称的 css 文件中,或者只是缩小文件而不合并。它不会强迫你下载 100 个 css 文件

标签: sass gulp


【解决方案1】:

这是有效的。它会正确处理您的 rogueSASS 文件,并在您想要的位置创建一个 css 文件夹,其中包含 css 文件。

重要提示:gulp.src 文件与您的 gulpfile.js 所在的位置相关。对于此代码,我将它放在 HTML 文件夹中 - 与 app_xxx 文件夹处于同一级别。如果你把它放在其他地方,你将不得不修改 sassFiles 和 rogueSassFiles 声明。

var gulp = require("gulp");
var sass = require("gulp-sass");

// flatten can be useful to solve tricky long directory changes
// var flatten = require("gulp-flatten");

var rename = require("gulp-rename");
// var using = require("gulp-using");


const sassFiles = './**/styles/scss/*.scss';
const rogueSassFiles = ['./**/*.scss', '!./**/styles/**'];


gulp.task('watch', ['sass', 'rogueSASS'], function () {
  gulp.watch( sassFiles, ['sass']);
  gulp.watch( rogueSassFiles, ['rogueSASS']);
})

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

  return gulp.src(sassFiles)
    .pipe(sass().on('error', sass.logError))

       // remove the "scss" folder name from the end of the directory list

    .pipe(rename(function (path) {
       var temp = path.dirname.slice(0, -4);
       path.dirname = temp + "css";
    }))

    .pipe(gulp.dest('.'))
})


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

  return gulp.src(rogueSassFiles)
      //   gulp-using shows which files are getting through gulp.src !!
      //  .pipe(using())
   .pipe(sass().on('error', sass.logError))
   .pipe(gulp.dest('.'))
})

这些可以组合成一个任务。

【讨论】:

  • 您好,感谢您的帮助,但我已经尝试过类似的事情,但效果并不理想。它不是在相对于 src 的文件夹中创建文件,而是在根目录中创建在 dest 中指定的文件夹,并且该文件夹包含 src 中的整个路径,但其中包含已编译的 css 文件。所以从www/html/app_abc/styles/scss/layout.scss 它创建了www/html/css/app_abc/styles/scss/layout.css IDK 为什么它不起作用,但我在谷歌上找不到任何可以帮助我的东西,所以我在这里发帖......另外,忽略部分是我试图解决一个最终无关的错误。
  • @MiChAeLoKGB 我更改了很多代码。事实证明,实现你的目标相对容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2016-04-20
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
相关资源
最近更新 更多