Sửa đổi tệp tại chỗ (cùng mục đích) bằng cách sử dụng Gulp.js và một hình cầu


99

Tôi có một nhiệm vụ gulp đang cố gắng chuyển đổi tệp .scss thành tệp .css (sử dụng gulp-ruby-sass) và sau đó đặt tệp .css kết quả vào cùng vị trí đã tìm thấy tệp gốc. Vấn đề là, vì tôi đang sử dụng một hình cầu, tôi không nhất thiết phải biết nơi lưu trữ tệp gốc.

Trong đoạn mã bên dưới, tôi đang cố gắng sử dụng gulp-tap để khai thác luồng và tìm ra đường dẫn tệp của tệp hiện tại mà luồng được đọc từ:

gulp.task('convertSass', function() {
    var fileLocation = "";
    gulp.src("sass/**/*.scss")
        .pipe(sass())
        .pipe(tap(function(file,t){
            fileLocation = path.dirname(file.path);
            console.log(fileLocation);
        }))
        .pipe(gulp.dest(fileLocation));
});

Dựa trên đầu ra của console.log(fileLocation), mã này có vẻ như nó sẽ hoạt động tốt. Tuy nhiên, các tệp CSS kết quả dường như được đặt cao hơn một thư mục mà tôi mong đợi. Đúng ra project/sass/partials, đường dẫn tệp kết quả chỉ là project/partials.

Nếu có một cách đơn giản hơn để làm điều này, tôi chắc chắn sẽ đánh giá cao giải pháp đó hơn nữa. Cảm ơn!

Câu trả lời:


155

Như bạn đã nghi ngờ, bạn đang làm cho điều này quá phức tạp. Điểm đến không cần phải động vì đường dẫn hình cầu cũng được sử dụng cho mục đích này dest. Đơn giản chỉ cần chuyển đến cùng một thư mục cơ sở mà bạn đang hiển thị src từ đó, trong trường hợp này là "sass":

gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest("sass"));

Nếu các tệp của bạn không có cơ sở chung và bạn cần chuyển một mảng đường dẫn, thì điều này không còn đủ nữa. Trong trường hợp này, bạn muốn chỉ định tùy chọn cơ sở.

var paths = [
  "sass/**/*.scss", 
  "vendor/sass/**/*.scss"
];
gulp.src(paths, {base: "./"})
  .pipe(sass())
  .pipe(gulp.dest("./"));

Ah, tuyệt vời. Cảm ơn bạn. Có một cách dễ dàng để sử dụng một cầu cho nguồn, nhưng chỉ cần đặt mọi thứ thẳng vào sassthư mục?
Dan-Nolan

2
Điều này không hiệu quả với tôi. Tôi phải làm gulp.src("dist/**/*")...gulp.dest("./")
niftygrifty

@ Dan-Nolan một cách để làm phẳng cấu trúc thư mục hình được sử dụng ngụm-đổi tên , xem câu hỏi này
numbers1311407

@niftygrifty Theo tài liệu,sẽ hoạt động trong tình huống bình thường. File được ghi vào con đường phù hợp globbed của họ chống lại một cơ sở tương đối tính , trong trường hợp này sass. Có lẽ plugin sass ở đây đã sửa đổi các đường dẫn?
1311407

1
Nhưng điều này không lưu tệp trong / sass chứ không phải trong thư mục con như / sass / any / where? Làm cách nào để lưu tệp trong đường dẫn hình cầu?
Đánh dấu

68

Điều này đơn giản hơn số 1311407 đã dẫn trên. Bạn không cần chỉ định thư mục đích, chỉ cần sử dụng .. Ngoài ra, hãy đảm bảo đặt thư mục cơ sở.

gulp.src("sass/**/*.scss", { base: "./" })
    .pipe(sass())
    .pipe(gulp.dest("."));

8
Đây là câu trả lời đúng. Nếu bạn đang cố gắng duy trì cấu trúc đích (tức là không làm phẳng cấu trúc), bạn phải chỉ ra thư mục cơ sở trong gulp.src.
Gui Ambros

2
Khi tôi thử điều này, các tệp được lưu trong "/" chứ không phải dưới đường dẫn hình cầu.
Đánh dấu

1
Những gì @GuiAmbros nói là không đúng, ít nhất là không theo tài liệu . Cơ sở, theo mặc định, được tính là mọi thứ trước đường dẫn hình cầu. Trong câu trả lời của tôi, cơ sở sẽ được tính là ./sass, nhưng câu hỏi chỉ định rằng đầu ra giữ lại sassdir, đó là lý do tại sao nó được lặp lại trong dest. Câu trả lời này đạt được cùng một kết quả bằng cách sử dụng tùy chọn cơ sở, nhưng không có cách tiếp cận nào là sai.
1311407

Cũng cần lưu ý rằng tình huống của OP có lẽ không phổ biến như vậy, ít nhất là đối với xử lý CSS, như bạn thường mong đợi để xuất vào một cssthư mục hoặc tương tự, không phải từ sassđến sass. Trong những trường hợp như vậy, câu trả lời được chấp nhận thực sự đơn giản hơn phương án này.
1311407

30
gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest(function(file) {
    return file.base;
  }));

Câu trả lời ban đầu được đưa ra tại đây: https://stackoverflow.com/a/29817916/3834540 .

Tôi biết chủ đề này đã cũ nhưng nó vẫn hiển thị dưới dạng kết quả đầu tiên trên google nên tôi nghĩ tôi cũng có thể đăng liên kết ở đây.


Chủ đề này đã cũ nhưng các câu trả lời vẫn đúng, mặc dù tôi cho rằng phương pháp này hơi KHÔ hơn (nếu hơi kém hiệu quả hơn). Câu hỏi được liên kết, thực sự, là một vấn đề của việc sử dụng destkhông đúng cách. Chắc chắn rằng các giải pháp đã đưa ra hiệu quả, nhưng làm đúng ngay lần đầu tiên, chỉ cần thay thế dest('./')bằng dest('./images'), sẽ đạt được kết quả tương tự.
1311407

Lý do giải pháp khác không hoạt động với tôi là do tôi có một mảng bên trong gulp.src (), ví dụ: gulp.src (['sass / **', 'common / sass / **']) và khi tôi tìm kiếm câu trả lời, đây là bài viết tôi đã tìm thấy. Có lẽ đã đưa ra là rõ ràng mặc dù
bobbarebygg

Có ý nghĩa. Trong trường hợp của bạn, vấn đề là không có cơ sở chung nào để tính toán gulp. Giải pháp của bạn hoạt động, nhưng giải pháp do @ NightOwl888 đưa ra để chỉ định cơ sở cũng sẽ hoạt động. Cập nhật câu trả lời được chấp nhận để bao gồm trường hợp không có cơ sở chung.
1311407

Đây phải là câu trả lời được chấp nhận! Không phải những cái khác, chỉ dành riêng cho một tệp hoặc cho một đường dẫn cơ sở.
MrCroft

0

Điều này rất hữu ích!

gulp.task("default", function(){

    //sass
    gulp.watch([srcPath + '.scss', '!'+ srcPath +'min.scss']).on("change", function(file) {
         console.log("Compiling SASS File: " + file.path)
         return gulp.src(file.path, { base: "./" })
        .pipe(sass({style: 'compressed'}))
        .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.init())
        .pipe(autoprefixer({
            browsers: ['last 2 versions'],
            cascade: false
        }))
        .pipe(sourcemaps.write('./'))         
        .pipe(gulp.dest(".")); 
    });

    //scripts
    gulp.watch([srcPath + '.js','!'+ srcPath + 'min.js']).on("change", function(file) {
        console.log("Compiling JS File: " + file.path)
        gulp.src(file.path, { base: "./" })
        .pipe(uglify())
        .pipe(rename({suffix: '.min'}))       
        .pipe(gulp.dest(".")); 
    });
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.