গুলপ.জেএস এবং একটি গ্লোব্বিং প্যাটার্ন ব্যবহার করে ফাইল (জায়গায় একই স্থানে) পরিবর্তন করুন


100

আমার কাছে একটি গুল্প টাস্ক রয়েছে যা .scss ফাইলগুলিকে .css ফাইলগুলিতে রূপান্তরিত করার চেষ্টা করছে (gulp-ruby-sass ব্যবহার করে) এবং তারপরে ফলাফলটি .এসএসএস ফাইলটিকে একই জায়গায় স্থাপন করতে পেল যা এটি আসল ফাইলটি খুঁজে পেয়েছিল। সমস্যাটি হ'ল যেহেতু আমি একটি গ্লোব্বিং প্যাটার্ন ব্যবহার করছি, মূল ফাইলটি কোথায় সঞ্চিত তা আমি অগত্যা জানি না।

নীচের কোডটিতে আমি স্রোতে ট্যাপ করতে গল্প-ট্যাপ ব্যবহার করার চেষ্টা করছি এবং স্রোতটি পড়ার বর্তমান ফাইলটির ফাইল পাথটি বের করার চেষ্টা করছিলাম:

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

এর আউটপুটের ভিত্তিতে console.log(fileLocation), এই কোডটি ঠিকঠাকভাবে কাজ করা উচিত বলে মনে হচ্ছে। তবে, ফলস্বরূপ সিএসএস ফাইলগুলি আমার প্রত্যাশার চেয়ে বেশি একটি ডিরেক্টরি স্থাপন করা হয়েছে বলে মনে হয়। এটি যেখানে হওয়া উচিত project/sass/partials, ফলস্বরূপ ফাইলের পথটি ঠিক project/partials

এটি করার যদি আরও সহজ উপায় থাকে তবে আমি অবশ্যই সমাধানটিকে আরও বেশি প্রশংসা করব। ধন্যবাদ!

উত্তর:


156

আপনি সন্দেহ হিসাবে, আপনি এটিকে খুব জটিল করে তুলছেন। গ্লোববেড পাথটি destপাশাপাশি ব্যবহার করা হওয়ায় গন্তব্যটিকে গতিশীল করার দরকার নেই । কেবলমাত্র একই বেস ডিরেক্টরিতে পাইপ করুন যা থেকে আপনি এসআরসি গ্লোব করছেন, এই ক্ষেত্রে "স্যাস":

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

যদি আপনার ফাইলগুলির একটি সাধারণ বেস না থাকে এবং আপনাকে কোনও পথের অ্যারে পাস করার প্রয়োজন হয়, এটি আর পর্যাপ্ত নয়। এই ক্ষেত্রে, আপনি বেস বিকল্পটি নির্দিষ্ট করতে চাই।

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

আহ, দুর্দান্ত ধন্যবাদ. উত্সটির জন্য কোনও গ্লোব ব্যবহার করার কী কী সহজ উপায় আছে, তবে সমস্ত কিছু সরাসরি sassফোল্ডারে রেখে দিন?
ড্যান-নোলান

4
এটি আমার পক্ষে কাজ করে না। আমাকে করতে হয়েছিল gulp.src("dist/**/*")...gulp.dest("./")
নিফটিগ্রিফটি

@ ড্যান-নোলান ফোল্ডার কাঠামোকে সমতল করার এক উপায় মনে হচ্ছে গুল্প-নামটি ব্যবহার করা হচ্ছে , এই প্রশ্নটি দেখুন
1311407

@niftygrifty ডক্স অনুসারে এটি একটি সাধারণ পরিস্থিতিতে কাজ করা উচিত । ফাইল একটি বিরুদ্ধে তাদের ম্যাচিং globbed পথ লেখা হয় গণনা আপেক্ষিক বেস এই ক্ষেত্রে, sass। সম্ভবত এখানে সাস প্লাগইন ইতিমধ্যে পাথগুলি সংশোধন করছে?
1311407

4
তবে এটি ফাইলটি / সাসে সংরক্ষণ করে না এবং / এসএস / কোনও / কোথায় যেমন সাব-ডিরেক্টরিতে নেই? আমি কীভাবে ফাইলগুলিকে গ্লোববেড পথে সংরক্ষণ করতে পারি?
চিহ্নিত করুন

68

এটি 1311407 সংখ্যাটি চালিয়ে যাওয়ার চেয়ে সহজ। আপনার গন্তব্য ফোল্ডারটি মোটেও নির্দিষ্ট করার দরকার নেই, কেবল ব্যবহার করুন .। এছাড়াও, বেস ডিরেক্টরি সেট করতে ভুলবেন না।

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

8
এটি সঠিক উত্তর। আপনি যদি গন্তব্য কাঠামো সংরক্ষণ করার চেষ্টা করছেন (উদাহরণস্বরূপ, কাঠামো চ্যাপ্টা করবেন না ), আপনাকে অবশ্যই gulp.src এর বেস ডিরেক্টরিটি নির্দেশ করতে হবে
গুই অ্যামব্রস

4
আমি যখন এটি চেষ্টা করি তখন ফাইলগুলি "/" তে সংরক্ষণ করা হয় এবং গ্লোববেডের নীচে নয়।
চিহ্নিত করুন

4
@ গুইআম্ব্রোস যা বলেছে তা সত্য নয়, অন্তত ডক্স অনুসারে নয় । বেস, ডিফল্টরূপে, গ্লোববেড পাথের আগে সবকিছু হতে গণনা করা হয়। আমার উত্তরে বেসটি গণনা করা হবে ./sass, তবে প্রশ্নটি নির্দিষ্ট করে যে আউটপুটটি ডিরকে ধরে রেখেছে sass, এ কারণেই এটি এর পুনরাবৃত্তি হয় dest। এই উত্তরটি বেস বিকল্পটি ব্যবহার করে একই ফলাফল অর্জন করে, তবে কোনও পদ্ধতিরই ভুল নয়।
1311407

এছাড়া উল্লেখযোগ্য যে ওপি অবস্থা সম্ভবত যে সাধারণ নয় সিএসএস প্রক্রিয়াকরণের জন্য অন্তত, যেমন সাধারণত আপনি একটি মধ্যে রপ্তানির আশা করতে চাই এর cssডিরেক্টরি বা অনুরূপ, না sassকরার sass। এই জাতীয় ক্ষেত্রে গ্রহণযোগ্য উত্তরটি আসলে এই বিকল্পের চেয়ে সহজ।
1311407

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

মূলত এখানে দেওয়া উত্তর: https://stackoverflow.com/a/29817916/3834540

আমি জানি যে এই থ্রেডটি পুরানো তবে এটি এখনও গুগলে প্রথম ফলাফল হিসাবে প্রদর্শিত হবে তাই আমি ভেবেছিলাম আমি পাশাপাশি লিঙ্কটি এখানে পোস্ট করতে পারি।


এই থ্রেডটি পুরানো তবে উত্তরগুলি এখনও সঠিক, যদিও আমি মনে করি এই পদ্ধতিটি সামান্য DRYer (যদি সামান্য কম দক্ষ হয়)। লিঙ্কযুক্ত প্রশ্নটি আসলেই destভুলভাবে ব্যবহার করার একটি সমস্যা ছিল । অবশ্যই দেওয়া সমাধান কাজ করে, কিন্তু ডান প্রথমবার এরকম, সহজভাবে প্রতিস্থাপন dest('./')সঙ্গে dest('./images'), হবে একই ফলাফল অর্জন করেছেন।
1311407

অন্য সমাধানটি আমার পক্ষে কাজ না করার কারণটি হ'ল gulp.src () যেমন gulp.src (['sass / **', 'সাধারণ / sass / **']) এর ভিতরে আমার একটি অ্যারে ছিল এবং যখন আমি অনুসন্ধান করি উত্তর, এটিই আমি খুঁজে পেয়েছি। যদিও সম্ভবত এটি আরও পরিষ্কার করা উচিত ছিল
bobarebygg

ইন্দ্রিয় তোলে। আপনার ক্ষেত্রে সমস্যাটি হ'ল দুল গণনা করার কোনও সাধারণ ভিত্তি নেই। আপনার সমাধানটি কাজ করে, তবে বেসটি নির্দিষ্ট করার জন্য @ নাইটওয়েল ৮৮৮ দ্বারা প্রদত্ত সমাধানটিও কাজ করবে। সাধারণ ভিত্তি না থাকার ক্ষেত্রে অন্তর্ভুক্ত করার জন্য গৃহীত উত্তরটি আপডেট করা।
1311407

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! অন্যগুলি নয়, যা কেবলমাত্র একটি ফাইল বা একটি বেস পাথের সাথে সুনির্দিষ্ট।
মিঃক্রফট

0

এটি খুব সহায়ক ছিল!

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(".")); 
    });
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.