জিএনইউ তৈরির পূর্বশর্ত হিসাবে আমি কীভাবে এইচটিটিপি থেকে ফাইলগুলি ব্যবহার করতে পারি?


10

আমি আমার মেকফিলগুলিতে পূর্বশর্ত হিসাবে ওয়ার্ল্ড ওয়াইড ওয়েব থেকে ফাইলগুলি ব্যবহার করতে চাই :

local.dat: http://example.org/example.gz
    curl -s $< | gzip -d | transmogrify >$@

আমি শুধু "সম্পূর্ণ পরিবর্তন করা" যদি দূরবর্তী ফাইল স্থানীয় ফাইল চেয়ে নতুন, শুধু মত চান করতে স্বাভাবিকভাবে কাজ করে।

আমি উদাহরণস্বরূপ ক্যাশেড অনুলিপি রাখতে চাই না - ফাইলগুলি বড়, এবং আমার কোনও কাঁচা ডেটার দরকার নেই। সাধারণত আমি ফাইলটি ডাউনলোড করা এড়াতে চাই। লক্ষ্যটি হ'ল মেক ফ্ল্যাগটি ব্যবহার করে সামান্য কিছু সংখ্যক প্রক্রিয়াজাতকরণ ।-j

এটি সমাধানের একটি পরিষ্কার উপায় কী? আমি যেতে কয়েকটি উপায় সম্পর্কে ভাবতে পারি:

  • লক্ষ্যটি পুনঃনির্মাণের সময় প্রতিবার আপডেট করা একটি খালি ডামি ফাইল রাখুন updated
  • জিএনইউ মেকের নতুন প্লাগইন সিস্টেম ব্যবহার করে কিছু প্লাগইন (যা সম্পর্কে আমি কিছুই জানি না)
  • একটি মেক-অজোনস্টিক উপায় যা স্থানীয় ফাইল সিস্টেমে এইচটিটিপি সার্ভারগুলিকে মাউন্ট করে

আরও খনন করার আগে, আমি কিছু পরামর্শ চাই, বিশেষত নির্দিষ্ট উদাহরণগুলি!

উত্তর:


15

আপনার মেকফিলটিতে এরকম কিছু চেষ্টা করুন:

.PHONY: local.dat

local.dat:
    [ -e example.gz ] || touch -d '00:00' example.gz
    curl -z example.gz -s http://example.org/example.gz -o example.gz
    [ -e $@ ] || touch -d 'yesterday 00:00' $@
    if [     "$(shell stat --printf '%Y' example.gz)" \
         -gt "$(shell stat --printf '%Y' $@)"         ] ; then \
      zcat example.gz | transmogrify >$@ ; \
    fi
    truncate -s 0 example.gz
    touch -r $@ example.gz

(দ্রষ্টব্য: এটি একটি মেকফাইল, সুতরাং ইনডেন্টগুলি ট্যাবগুলি রয়েছে, ফাঁকা স্থান নয় course অবশ্যই এটিও গুরুত্বপূর্ণ যে \ধারাবাহিকতা লাইনের পরে কোনও ফাঁকা স্থান নেই - বিকল্পভাবে ব্যাকস্ল্যাশ-পলায়নগুলি থেকে মুক্তি পান এবং এটি দীর্ঘতর করুন, প্রায়-অপঠনযোগ্য লাইন)

এই গনুহ makeরেসিপি প্রথম চেক করে একটি ফাইল নামক example.gzবিদ্যমান (কারণ আমরা এটি ব্যবহার করা চলুন -zমধ্যে curl), এবং সঙ্গে এটি তৈরি করে touchযদি এটা না। স্পর্শ এটিকে 00:00 (বর্তমান দিনের 12 টা) টাইমস্ট্যাম্প দিয়ে তৈরি করে।

তারপর এটি ব্যবহার curlএর -z( --time-cond) শুধুমাত্র ডাউনলোড করার বিকল্প example.gzযদি এটা শেষ সময় এটা ডাউনলোড করা হয়েছে যেহেতু পরিবর্তন করা হয়েছে। -zএকটি প্রকৃত তারিখের এক্সপ্রেশন বা কোনও ফাইলের নাম দেওয়া যেতে পারে। যদি কোনও ফাইলের নাম দেওয়া হয় তবে এটি ফাইলের পরিবর্তনের সময়টিকে সময় শর্ত হিসাবে ব্যবহার করবে।

এর পরে, যদি local.datএটি বিদ্যমান না থাকে touchতবে এটি তার চেয়ে পুরনো হওয়ার গ্যারান্টিযুক্ত টাইমস্ট্যাম্প ব্যবহার করে এটি তৈরি করে example.gz। এটি আবশ্যক কারণ local.datএর পরবর্তী statটাইমস্ট্যাম্পটি পেতে তার পরবর্তী কমান্ডটি ব্যবহার করতে হবে।

তারপরে, যদি example.gzএর চেয়ে টাইমস্ট্যাম্প আরও নতুন থাকে তবে local.datএটি পাইপ example.gzদেয় transmogrifyএবং আউটপুটটিকে পুনর্নির্দেশ করে local.dat

শেষ পর্যন্ত, এটি বুককিপিং এবং ক্লিনআপ স্টাফগুলি করে:

  • এটি কেটে যায় example.gz(কারণ আপনার কেবল একটি টাইমস্ট্যাম্প রাখতে হবে, এবং পুরো ফাইলটি নয়)
  • touchএস example.gzযাতে এটি একই টাইমস্ট্যাম্প আছেlocal.dat

.FONY লক্ষ্য নিশ্চিত করে যে লক্ষ্যটি local.datসর্বদা কার্যকর করা হয়, এমনকি যদি সেই নামের ফাইলটি ইতিমধ্যে বিদ্যমান থাকে।

আমার মূল সংস্করণটি কার্যকর হবে না এবং কেন তা করা মন্তব্যে নির্দেশ করার জন্য @ টবি স্পিডকে ধন্যবাদ জানাই।

বিকল্পভাবে, আপনি যদি transmogrifyপ্রথমে ফাইল সিস্টেমে ডাউনলোড না করেই ফাইলটি সরাসরি পাইপ করতে চান :

.PHONY: local.dat

local.dat:
    [ -e example.gz ] || touch -d '00:00' example.gz
    [ -e $@ ] || touch -d 'yesterday 00:00' $@
    if [     "$(shell stat --printf '%Y' example.gz)" \
         -gt "$(shell stat --printf '%Y' $@)"         ] ; then \
      curl -z example.gz -s http://example.org/example.gz | transmogrify >$@ ; \
    fi
    touch -r $@ example.gz

দ্রষ্টব্য: এটি বেশিরভাগই অন্টিস্টেড হয় তাই সিন্টেক্সটি ঠিক সঠিকভাবে পেতে কিছুটা ছোটখাটো পরিবর্তন প্রয়োজন হতে পারে। এখানে গুরুত্বপূর্ণ বিষয়টি হল পদ্ধতি, কোনও অনুলিপি-পেস্ট কার্গো-কাল্ট সমাধান নয় solution

আমি কয়েক দশক ধরে এই পদ্ধতির (অর্থাত্ touchএকটি টাইমস্ট্যাম্প ফাইলটি) ব্যবহার করে আসছি make। এটি কার্যকরভাবে কাজ করে এবং সাধারণত আমার নিজের উপর নির্ভরশীলতা রেজোলিউশন কোডটি sh এ লিখতে না দেওয়া (যদিও আমাকে এ জাতীয় কিছু করতে হবে stat --printf %Y)।

সকলেই জানেন makeসফ্টওয়্যার সংকলনের একটি দুর্দান্ত সরঞ্জাম ... আইএমও এটি সিস্টেম অ্যাডমিন এবং স্ক্রিপ্টিং কার্যগুলির জন্য খুব কম আন্ডার রেটেড সরঞ্জাম।


1
-zপতাকা, অবশ্যই, ধরে নেয় যে দূরবর্তী সার্ভারে ব্যবহার If-Modified-Sinceহেডার। এটি অগত্যা ক্ষেত্রে নাও হতে পারে। সার্ভার সেটআপের উপর নির্ভর করে আপনার পরিবর্তে হেডারের সাহায্যে কিছু ETagপরীক্ষা করার প্রয়োজন হতে পারে Cache-Controlবা আলাদা চেকসাম ফাইলটি পরীক্ষা করে (যেমন সার্ভার একটি সরবরাহ করে তবে sha1sum)।
বব

হ্যাঁ এটা করে. কিন্তু যে ছাড়া, সেখানে কি করছেন ওপি চায় সব সময়ে কোন উপায় আছে (যদি না তিনি একটি টেম্প ফাইলের বিশাল ফাইল ডাউনলোড করতে ইচ্ছুক এর প্রত্যেক সময় তিনি রান make, ব্যবহার cmpবা পুরানো এবং নতুন ফাইল তুলনা করতে পারছেন, এবং mv newfile oldfileযদি তারা আলাদা হয়) । বিটিডাব্লু, ক্যাশে-নিয়ন্ত্রণ শিরোনাম আপনাকে জানায় না যে ফাইলটি একটি নির্দিষ্ট সময়ের চেয়ে নতুন। সার্ভার প্রশাসকরা আপনাকে কতক্ষণের জন্য একটি প্রদত্ত ফাইল ক্যাশে করতে চান তা আপনাকে জানান - এবং প্রায়শই তাদের ওয়েব পরিসংখ্যান "উন্নত" করতে ক্যাশে-বস্টিং অনুশীলন হিসাবে বিপণন ড্রয়েড দ্বারা ব্যবহৃত হয়।
কাশ

ETag এটি করার আরেকটি উপায়, যেমন একটি পৃথক চেকসাম ফাইল। এটি সার্ভার সেট আপ করার উপর নির্ভর করে। উদাহরণস্বরূপ, কেউ সিডিমাজেড.ডিবিয়ান.আর.ডি / লেবিয়ান-সিডি / কর্নার/amd64/iso-cd/SHA1SUMS আনতে পারে এবং পুরো আইএসও আনার সিদ্ধান্ত নেওয়ার আগে এটি পরিবর্তন হয়েছে কিনা তা পরীক্ষা করতে পারে । ইটাগ পৃথক ফাইলের পরিবর্তে শিরোনাম ব্যবহার করে একই কাজ করে (এবং যেমন If-Modified-Sinceএটি এইচটিটিপি সার্ভার প্রয়োগ করে)। Cache-Controlঅন্য কোনও পদ্ধতি সমর্থিত না হলে ফাইলটি ডাউনলোড করার ক্ষেত্রে সর্বশেষ-অবলম্বন বিকল্প হবে - এটি ভবিষ্যতের ভবিষ্যদ্বাণী করার চেষ্টা করার কারণে এটি অবশ্যই সবচেয়ে কম সঠিক।
বব

তাত্ক্ষণিকভাবে, ETag/ If-None-Matchএবং অন্যান্য চেকসামগুলিও এর চেয়ে বেশি নির্ভরযোগ্য If-Modified-Since। যাই হোক না কেন, এই মন্তব্যগুলি কেবলমাত্র উত্তরের অনুমানগুলি (যেমন, এটি -zসার্ভার সমর্থনটি ধরে নেয়) তুলে ধরার চেষ্টা করে - মূল পরিবর্তনটি অন্যান্য পরিবর্তন-পরীক্ষার অ্যালগরিদমগুলির সাথে খাপ খাইয়ে নেওয়া মোটামুটি সহজ হওয়া উচিত।
বব

1
ইটাগের উপর ভিত্তি করে একটি সমাধান বাস্তবায়িত করে একটি উত্তর লিখতে নির্দ্বিধায়। যদি এটি কোনও ভাল হয় তবে আমি এটি উত্সাহিত করব। এবং তারপরে কেউ উপস্থিত হবে এবং দেখিয়ে দেবে যে সমস্ত ওয়েব সার্ভার একটি ইটাগ শিরোনাম সরবরাহ করে না :)।
কাশ

1

আরেকটি বিকল্প হ'ল একটি বিল্ড সিস্টেম ব্যবহার করা যা পুনর্নির্মাণগুলি ট্রিগার করতে হবে কিনা তা নির্ধারণের জন্য নির্ভরতা চেকসাম ব্যবহার করে। আমি জ্ঞানু দিয়ে "স্পর্শ" কৌশলটি তৈরি করেছি অনেক কিছু তৈরি, তবে আপনি যখন ডায়নামিক নির্ভরতা নির্দিষ্ট করতে পারেন এবং যে ফাইলগুলি পরিবর্তিত হয় না তখন পুনর্নির্মাণগুলি তৈরি করে না it's গুডমেক ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে :

#! /usr/local/goodmake.py /bin/sh -se

#! *.date
    # Get the last-modified date
    curl -s -v -X HEAD http://${1%.date} 2>&1 | grep -i '^< Last-Modified:' >$1

#? local.dat
    site=http://example.org/example.gz
    $0 $site.date
    curl -s $site | gzip -d | transmogrify >$1

পরিবর্তে -X HEADকার্লের ম্যানপেজটি ব্যবহারের পরামর্শ দেয় -I: "(-X) কেবল এইচটিটিপি অনুরোধে ব্যবহৃত প্রকৃত শব্দটি পরিবর্তন করে , কার্লের আচরণের পদ্ধতিটিকে কোনও পরিবর্তন করে না So সুতরাং উদাহরণস্বরূপ আপনি যদি সঠিক হেড অনুরোধ করতে চান, -X হেড যথেষ্ট হবে না। আপনাকে -I, - হেড বিকল্পটি ব্যবহার করতে হবে। "
লাইটস্ট্রোক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.