আমি কীভাবে ডিরেক্টরি গুলির সাথে পুনরাবৃত্তভাবে অনুলিপি করব?


167

আমি একটি ওয়ার্কিং ডিরেক্টরি থেকে সার্ভারে একই প্রকল্প (একই মেশিন) মঞ্চ করার চেষ্টা করছি। নিম্নলিখিত কোড ব্যবহার করে:

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

আমি অনুলিপিযুক্ত সমস্ত ফাইল দেখতে আশা করব। তবে এটি dir কাঠামো সমতল করে - সমস্ত ডিরেক্টরি অনুলিপি করা হয় তবে প্রতিটি ফাইল মূলে স্থাপন করা হয়/var/www

গুল্প একটি দুর্দান্ত বিল্ড টুলের মতো মনে হচ্ছে তবে আইটেমগুলি অনুলিপি করা অবশ্যই একটি সহজ প্রক্রিয়া হওয়া উচিত?


9
এই প্রশ্নটি পড়া যে কোনও নতুন দর্শকের কাছে, এটি লক্ষ করা উচিত যে সর্বাধিক ভোট দেওয়া উত্তর চ্যাপ্টা না ডিরেক্টরিগুলির মূল প্রশ্নের স্পেসিফিকেশন সমাধান করতে কাজ করে না। এটা তোলে সমস্যার মানুষ সব না ফাইলগুলির সাথে ভুগেন সমাধান নেই ভিতরে কপি হওয়া থেকে একটি ডিরেক্টরি, যাতে দরকারী!
এম

1
সমতল না করে, আপনি কি বোঝাতে চেয়েছেন যে আপনি 'সিএসএস', 'জেএস', এবং 'এসসিআর' ডিরেক্টরিতে উপস্থিত থাকতে চান /var/www/? আপনি চেষ্টা করতে পারেন{css,js,src}/**/*
জেসন গোয়েমাট

আমি জানি যে গ্লোব সম্প্রসারণ গল্ফের অভ্যন্তরে কাজ করে তবে আমি বিভ্রান্ত হব যদি তা প্রতিটি তালিকার একটি পৃথক লাইন হিসাবে আলাদা আলাদাভাবে কাজ করে - কারণ গ্লোব সম্প্রসারণ মূলত মৃত্যুদন্ড কার্যকর করার আগে একটি তালিকায় প্রসারিত করার উদ্দেশ্যে।
এম 1 কে

উত্তর:


319

নিম্নলিখিতটি ফোল্ডার কাঠামোকে সমতল না করে কাজ করে:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

'**/*'গুরুত্বপূর্ণ অংশ। এই অভিব্যক্তিটি একটি গ্লোব যা একটি শক্তিশালী ফাইল নির্বাচন সরঞ্জাম। উদাহরণস্বরূপ, শুধুমাত্র .js ফাইলগুলি অনুলিপি করার জন্য:'input/folder/**/*.js'


2
মনে হয় আপনি gulp.dest যোগ করতে ভুলে গেছেন। হওয়া উচিত.pipe(gulp.dest('output/folder'));
ম্যাথু স্প্রঙ্কল

3
একটি নির্দিষ্ট ফাইল এক্সটেনশন দিয়ে আপনি এটি কীভাবে করবেন?
শেভ

1
আপনি ফাইলের আসল সেট জন্য একটি উদাহরণ প্রদান উত্তর সম্পাদনা করতে পারেন? আমি নিশ্চিত যে এটি কীভাবে আরও উপযুক্ত তবে এটি {base:"."}পদ্ধতির তুলনায় এটি কীভাবে কাজ করে তা দেখে আমি খুশি হব ।
এম 1ke

2
baseএই জবাবটি হিসাবে দেওয়া আছে যে ডিফল্টটি "ফোল্ডার" note অন্য কথায়, বেসটি শুরু হয় যেখানে গ্লোব প্যাটার্ন শুরু হয়। এটি আমার বুঝতে যেখানে আমার ফাইল শেষ পর্যন্ত এবং কেন আপনি দরকার নেই যাবে সাহায্য করেছিল **/*মধ্যে gulp.destপ্যারামিটার। গুল্প গ্লোবে সমস্ত কিছু নেয় এবং এটি একই কাঠামোর সাথে ডেসট ফোল্ডারে রাখে।
নিল মনরো

3
এটি জিজ্ঞাসিত প্রশ্নের পুরো উত্তর দেয় না। এটি পুনরাবৃত্তভাবে সঠিকভাবে অনুলিপি করার জন্য এটি একটি দুর্দান্ত সমাধান, তবে বেস ডিরেক্টরিটি কীভাবে পরিবর্তন করতে হবে তার উত্তর দেয় না।
ty1824

173

দেখা যাচ্ছে যে একটি সম্পূর্ণ ডিরেক্টরি কাঠামো অনুলিপি gulpকরতে আপনার gulp.src()পদ্ধতির জন্য একটি বেস সরবরাহ করা দরকার ।

সুতরাং gulp.src( [ files ], { "base" : "." })উপরের কাঠামোতে সমস্ত ডিরেক্টরিকে পুনরাবৃত্তভাবে অনুলিপি করতে ব্যবহার করতে পারেন।

যদি, আমার মতো, আপনি এটি ভুলে যেতে পারেন তবে চেষ্টা করুন:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};

1
বর্তমান ওয়ার্কিং ডিরেক্টরি সেট করতে "সিডব্লিউডি" কনফিগারেশন যুক্ত করুন।
স্কারলোট

3
যদি baseএখনও আপনাকে বিভ্রান্ত করে থাকে তবে স্ট্যাকওভারফ্লো . com/ a/ 35848322/11912 দেখুন যা এটির ব্যাখ্যা দেওয়ার দুর্দান্ত কাজ করে।
জেমস স্কেম্প

60

সুতরাং - একটি বেস কাজ সরবরাহ করার সমাধানটি প্রদত্ত যে সমস্ত পাথের একই বেস পাথ রয়েছে। তবে আপনি যদি বিভিন্ন বেস পাথ সরবরাহ করতে চান তবে এটি এখনও কাজ করবে না।

এই সমস্যার সমাধান করার একটি উপায় হ'ল পথের আপেক্ষিকতা সম্পর্কিত করে। আপনার ক্ষেত্রে:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

এই কাজটি করার কারণটি হল যে গুল্প বেসটিকে প্রথম স্পষ্ট অংশের সমাপ্তি হিসাবে সেট করে - শীর্ষস্থানীয় * এটি সিডব্লিউডে বেস স্থাপনের কারণ করে (যা আমরা সবাই চাই ফলাফল!)

এটি কেবলমাত্র তখনই কাজ করে যদি আপনি নিশ্চিত করতে পারেন যে আপনার ফোল্ডারের কাঠামোটিতে এমন কয়েকটি পাথ নেই যা দু'বারের সাথে মেলে। উদাহরণস্বরূপ, আপনার যদি randomjs/একই স্তরে থাকে তবে আপনি jsউভয়টিই মিলে যাবেন।

এটি একমাত্র উপায় যা আমি এগুলিকে একটি শীর্ষ-স্তরের gulp.src ফাংশনের অংশ হিসাবে অন্তর্ভুক্ত করে দেখতে পেয়েছি। এমন একটি প্লাগইন / ফাংশন তৈরি করা সম্ভবত সহজ হবে যা এই গ্লোবগুলির প্রতিটি পৃথক করে যাতে আপনি তাদের জন্য বেস ডিরেক্টরিটি নির্দিষ্ট করতে পারেন।


আমি মনে করি যে একাধিক বেস পাথ শুরু করা সম্ভবত প্রশ্নের ক্ষেত্র ছাড়িয়ে গেছে। আমার আসল প্রশ্ন থেকে আমি ফাইলগুলিকে একটি নিখুঁত পথে নিয়ে যাচ্ছিলাম, তবে সমস্যাটি এখনও ঘটেছে, যে কোনও ভিত্তিকে নির্দিষ্ট না করেই, আমার সমস্ত গ্লোব থেকে সমস্ত ফাইলগুলি তাদের বিদ্যমান শ্রেণিবদ্ধ অনুসরণ না করে একটি একক ডিরেক্টরিতে অনুলিপি করা হয়েছিল।
এম 1ke 8

2
@ এম 1 এ সত্য, আপনার প্রশ্নের মূল বিষয়টি বিভিন্ন ভিত্তিক পথে পরিচালিত হয়নি। তবে, আপনি উল্লেখ করেছেন However it flattens the dir structure - all directories are copied but every file is placed in the root /var/www, এবং এটিই আসলে আমি আপনার প্রশ্নটি পেয়েছি - আমি বিভিন্ন বেস পাথগুলির সাথে কীভাবে পুনরাবৃত্তভাবে অনুলিপি করতে পারি তার একটি সমাধান অনুসন্ধান করছিলাম। মূলত, এই সমাধান একটি মাল্টি-বেস পথ ক্ষেত্রে জন্য একটি ডিফল্ট বেস উল্লেখ না করেও আপনার ক্ষেত্রে জন্য কাজ করে, কিন্তু, যতদিন আপনি যে নেতৃস্থানীয় তারকা কিছুই :) সাথে মেলে নিশ্চিত করতে পারে
ty1824

6
এই উত্তর ব্যতিক্রমী। এটি একটি স্বেচ্ছাসেবী সূচনা পয়েন্ট থেকে কোনও পথ অনুলিপি করার জন্য বিশেষভাবে ডিল করে। src 'assets/subdir/*fonts/*'হ'ল ফন্টগুলি অনুলিপি করতে পারে ।
ওয়াটওয়ার

-4

যদি আপনি কোনও ফোল্ডারের সম্পূর্ণ বিষয়বস্তু পুনরাবৃত্তভাবে অন্য কোনও ফোল্ডারে অনুলিপি করতে চান তবে নীচের উইন্ডোজ কমান্ড গুলপ থেকে কার্যকর করতে পারেন:

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

/yশেষে বিকল্প ঊর্ধ্বলিপি নিশ্চিতকরণ বার্তা দমন হয়।

লিনাক্সে, আপনি গুল্প থেকে নিম্নলিখিত কমান্ডটি প্রয়োগ করতে পারেন:

cp -R /path/to/srcfolder /path/to/destfolder

gulp থেকে সিস্টেম কমান্ড কার্যকর করতে আপনি gulp-exec বা gulp-run প্লাগইন ব্যবহার করতে পারেন ।

সম্পর্কিত লিংক:

  1. এক্সকপি ব্যবহার

  2. gulp-exec এবং gulp-run


7
এখানে শেলের পিছনে ফিরে যাওয়ার সমস্যাটি হ'ল আপনি স্ট্রিমে অন্যান্য কমান্ড যেমন সংক্ষেপণ বা বিশ্লেষণ সরঞ্জামগুলি চালনার ক্ষমতা হারাবেন।
এম 1 কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.