config.assets.compile = রেল উত্পাদনে সত্য, কেন নয়?


184

ডিফল্ট অ্যাপ্লিকেশন ইনস্টল পাগল দ্বারা rails newহয়েছে config.assets.compile = falseউৎপাদনে।

এবং জিনিসগুলি করার সাধারণ উপায় হ'ল rake assets:precompileআপনার অ্যাপ্লিকেশন মোতায়েনের আগে চালানো , সম্পদ পাইপলাইনের সমস্ত সম্পদ সংকলিত হয়েছে কিনা তা নিশ্চিত করা।

তাহলে আমি config.assets.compile = trueযদি প্রযোজনায় সেট করি তবে কী হয় ?

আমার precompileআর দৌড়াতে হবে না। আমার বিশ্বাস যা ঘটবে তা হ'ল প্রথমবার যখন কোনও সম্পদের অনুরোধ করা হয়েছিল, এটি সংকলন করা হবে। এটি প্রথমবারের মতো একটি পারফরম্যান্স হিট হবে (এবং এর অর্থ এটি করতে সাধারণত আপনার জেএস রানটাইম প্রয়োজন হয়)। তবে এই ডাউনসাইড ছাড়া অন্য, সম্পদটি অলসভাবে সংকলিত হওয়ার পরে, আমি মনে করি যে সেই সম্পত্তিতে পরবর্তী সমস্ত অ্যাক্সেসের কোনও কার্যকারিতা হিট হবে না, এই প্রথম প্রথম-হিট অলস সংকলনের পরে অ্যাপের কার্য সম্পাদন প্রাক্পম্পাইল সম্পদের সাথে ঠিক একই হবে । এটা কি সত্য?

আমি কি অনুপস্থিত কিছু আছে? অন্য কোনও কারণেই config.assets.compile = trueপ্রযোজনা নির্ধারণ করা হয়নি ? যদি আমি উত্পাদন একটি জেএস রানটাইম পেয়েছি, এবং একটি সম্পদ প্রথম অ্যাক্সেসের জন্য অবনমিত পারফরম্যান্স এর ট্রেড অফ নিতে ইচ্ছুক , না চালানোর জন্য বিনিময়ে precompile, এই অর্থ কি?


1
সতর্কতা, স্প্রোকেটগুলির পুরানো সংস্করণগুলিতে একটি বাগ রয়েছে এবং কনফিগারেশন.সেসটস.কমকে সঠিকভাবে কনফিগার করা থাকলে ডিরেক্টরি ট্রাসভার্সাল দুর্বলতার ঝুঁকি রয়েছে ( blog.heroku.com/rails-asset-pipline-vulnerability )
মাউরো

স্ট্যাকওভারফ্লো ঠিক এভাবে কাজ করার কথা। একটি ভাল লিখিত প্রশ্ন এবং একটি ভাল লিখিত উত্তর। আমি আপনাকে উভয় পছন্দ এবং @ রিচার্ড-হুলসে ভালবাসি।
schmijos

উত্তর:


258

আমি গাইড এর বিট লিখেছি।

আপনি অবশ্যই উত্পাদনে সংকলন বাঁচতে চান না।

আপনি যখন সংকলন করেছেন, তখন এটি ঘটে:

সম্পত্তিতে ফাইলের প্রতিটি অনুরোধ স্প্রোকেটকে দেওয়া হয়। উপর প্রথম প্রতিটি সম্পদের জন্য এটিকে সংকলিত করতে অনুরোধ এবং যাই হোক না কেন পাগল মধ্যে ক্যাশে ক্যাশে (সাধারণত ফাইল সিস্টেম থেকে) ব্যবহার হয়।

পরবর্তী অনুরোধে স্প্রোকেটগুলি অনুরোধটি গ্রহণ করে এবং ফিঙ্গারপ্রিন্টযুক্ত ফাইলের নামটি সন্ধান করতে হবে, সম্পদটি তৈরি করা ফাইল (চিত্র) বা ফাইলগুলি (সিএসএস এবং জেএস) সংশোধন করা হয়নি এবং তারপরে যদি কোনও ক্যাশেড সংস্করণ থাকে তবে তা পরিবেশন করবে।

যে সবকিছু সম্পদ ফোল্ডারে এবং কোন বিক্রেতা ইন / সম্পদ ফোল্ডার প্লাগিন দ্বারা ব্যবহৃত।

এটি প্রচুর ওভারহেড হিসাবে, সত্য বলতে, কোড গতির জন্য অনুকূলিত হয় না।

এর প্রভাব কীভাবে ক্লায়েন্টের কাছে তারের উপর দিয়ে যায় তার উপর প্রভাব ফেলবে এবং এটি আপনার সাইটের পৃষ্ঠা লোডের সময়ে নেতিবাচকভাবে প্রভাব ফেলবে।

ডিফল্ট সাথে তুলনা করুন:

সম্পদগুলি পূর্বনির্ধারিত হয় এবং সংকলন বন্ধ থাকে, সম্পদগুলি সংকলিত হয় এবং এর কাছে ফিঙ্গারপ্রিন্ট করা হয় public/assets। স্প্রোকেটস প্লেসের একটি ম্যাপিং টেবিলটি রিয়েলগুলিতে ফিঙ্গারপ্রিন্টযুক্ত ফাইলের নামগুলিতে ফিরিয়ে দেয় এবং রেলগুলি এটি ফাইল সিস্টেমে লিখে দেয়। ম্যানিফেস্ট ফাইলটি (রেলগুলিতে ওয়াইএমএল 3 বা জেলগুলিতে জেলএসএসে জেলএসএস 4) প্রারম্ভকালে রেলস দ্বারা মেমরিতে লোড করা হয় এবং সম্পদ সহায়ক পদ্ধতি দ্বারা ব্যবহারের জন্য ক্যাশে করা হয়।

এটি সঠিকভাবে আঙুলের ছাপযুক্ত সম্পদের সাথে পৃষ্ঠাগুলির প্রজন্মকে খুব দ্রুতগতিতে পরিণত করে এবং ফাইলগুলি সেবার ওয়েব-সার্ভার-থেকে-ফাইল-সিস্টেমটি দ্রুততর হয়। উভয় নাটকীয়ভাবে লাইভ সংকলনের চেয়ে দ্রুত।

পাইপলাইন এবং ফিঙ্গারপ্রিন্টিংয়ের সর্বাধিক সুবিধা পেতে আপনাকে আপনার ওয়েব সার্ভারে সুদূর ভবিষ্যতের শিরোনাম স্থাপন করতে হবে এবং জেএস এবং সিএসএস ফাইলগুলির জন্য জিজিপ সংক্ষেপণ সক্ষম করতে হবে। স্প্রোকেটগুলি সম্পদের গিজিপযুক্ত সংস্করণ লিখেছে যা আপনি আপনার সার্ভারটি ব্যবহারের জন্য সেট করতে পারেন এবং প্রতিটি অনুরোধের জন্য এটি করার প্রয়োজনীয়তা সরিয়ে ফেলে।

এটি ক্লায়েন্টকে যত তাড়াতাড়ি সম্ভব সম্পদগুলি সরিয়ে দেয় এবং ছোট আকারে সম্ভব, পৃষ্ঠাগুলির ক্লায়েন্ট-পার্শ্ব প্রদর্শন দ্রুত করা এবং (ভবিষ্যতের শিরোনামের সাথে) অনুরোধগুলি হ্রাস করে।

সুতরাং আপনি যদি লাইভ সংকলন করেন তবে তা হ'ল:

  1. খুব ধীর
  2. সংকোচনের অভাব রয়েছে
  3. পৃষ্ঠাগুলির রেন্ডার সময়কে প্রভাবিত করবে

বনাম

  1. যত দ্রুত সম্ভব
  2. কম্প্রেস
  3. সার্ভার থেকে সংক্ষেপণ ওভারহেয়ার্ড সরান (allyচ্ছিকভাবে)
  4. পৃষ্ঠাগুলির রেন্ডার সময়কে হ্রাস করুন।

সম্পাদনা: (মন্তব্য অনুসরণ করার উত্তর)

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

এছাড়াও, সমস্ত সম্পদ সংকলন এবং স্থানে না হওয়া পর্যন্ত কাউকে অজানা সময়ের জন্য ধীর সম্পদ সরবরাহের মূল্য দিতে হবে।

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

চুক্তিভঙ্গকারী হ'ল এটি উত্পাদন ব্যবস্থায় অনেক জটিলতা যুক্ত করে।

[সম্পাদনা করুন, জুন ২০১৫] আপনি যদি এটি পড়তে থাকেন কারণ আপনি যখন কোনও মোতায়েনের সময় ধীর সংকলনের জন্য সমাধানের সন্ধান করছেন, তবে আপনি স্থানীয়ভাবে সম্পদগুলি পূর্ববর্তীকরণ বিবেচনা করতে পারেন। এ সম্পর্কিত তথ্য সম্পদ পাইপলাইন গাইডে রয়েছে । এটি আপনাকে স্থানীয়ভাবে কেবল প্রাক-কম্পাইল করতে দেয় যখন কোনও পরিবর্তন হয়, প্রতিশ্রুতি দেয় এবং তারপরে কোনও পূর্ব-পর্ব পর্যায়ক্রমে দ্রুত মোতায়েন করা হয়।


1
ধন্যবাদ, আমি আপনার উত্তর গ্রহণ করেছি। তবে এখন আমার প্রশ্নটি হ'ল, ঠিক আছে, এটি এখন তা করে না, তবে আপনি কী মনে করেন যে সম্পদ পাইপলাইনে এমন একটি বৈশিষ্ট্য থাকতে পারে যেখানে এটি প্রথম অনুরোধে অলসভাবে সংকলিত হয়েছিল, এটি ঠিক / প্রাক-গণিতের মতো লেখার মতো প্রাকপম্পাইলের মতো কাজ করে এবং আপডেট করে ating ফিঙ্গারপ্রিন্ট প্রকাশ?
jrochPoint

উপরে দেখুন. ক্যাপিস্ট্রানো আপনার পক্ষে কাজ করে না বলে এটি কি সমস্যা?
রিচার্ড হুলস

আমি ক্যাপিস্ট্রানো ব্যবহার করি না। আমার আগে প্রয়োজন হয়নি, যুক্ত জটিলতা এটির জন্য উপযুক্ত ছিল না। সম্ভবত সম্পদ পাইপলাইন হ'ল খড় যা উটগুলি পিছনে পিছনে ভাঙে এবং এটির প্রয়োজন হয়। আপনার মতে, ক্যাপিস্ট্রানো বা অনুরূপ ছাড়াই রেলগুলি সম্পদ পাইপলাইনের সাথে মোতায়েন পরিচালনা করা অসম্ভব ? এটি লজ্জাজনক, সাধারণ সেটআপগুলির জন্য এটি হাত দ্বারা এটি করা কোনও বড় সমস্যা হবে না।
জ্রোকাইন্ড

আপনার সত্যিই রেল ৩.১ এর জন্য ক্যাপিস্ট্রানো দরকার। আপনার পুরানো অ্যাপ্লিকেশনটি এখনও চলমান থাকা অবস্থায় সম্পদগুলি একটি নতুন পাবলিক ডিরেক্টরিতে সংকলিত। কম্পাইলটি সম্পন্ন হয়ে গেলে নতুন সংস্করণটি সিমলিংকড করা হবে এবং সার্ভারটি স্বয়ংক্রিয়ভাবে পুনরায় চালু হবে।
রিচার্ড হুলসে

"পাইপলাইন এবং ফিঙ্গারপ্রিন্টিংয়ের সর্বাধিক সুবিধা পেতে আপনাকে আপনার ওয়েব সার্ভারে সুদূর ভবিষ্যতের শিরোনাম স্থাপন করতে হবে, এবং জেএস এবং সিএসএস ফাইলগুলির জন্য জিজিপ সংক্ষেপণ সক্ষম করতে হবে।" - আপনি কীভাবে কিছু নির্দেশনা বা লিঙ্ক সরবরাহ করতে পারেন? এই?
আইজাক বিতেশ

7

প্রাক-সংকলন জিনিসটির সাথে কম ওভারহেড থাকা।

Precompile everything initially with these settings in production.rb
# Precompile *all* assets, except those that start with underscore
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/

তারপরে আপনি কেবল।


6

যেহেতু হেরোকু ব্যবহার করে:

যদি আপনি হার্কুতে মোতায়েন করেন তবে সংকলিত সম্পদ অন্তর্ভুক্ত না করা (অর্থাত্ public/assetsপ্রতিশ্রুতিবদ্ধ নয়) অতএব config.assets.compile = true, বা পূর্বনির্ধারিত সম্পদের প্রতিশ্রুতিবদ্ধ না হলে এটি মোতায়েনের সময় স্বয়ংক্রিয়ভাবে স্থাপনের সময় আপনার পূর্ববর্তী কাজ করবে।

হিরোকুর ডক্স এখানে । ডায়নো রিসোর্সের লোড অপসারণ করার জন্য একটি সিডিএন প্রস্তাবিত।


1

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


হুম, আমি ভেবেছিলাম যে precompile=trueসংকলিত সম্পদগুলি ফাইল সিস্টেমে লেখা হবে। তুমি কি নিশ্চিত? আমাকে চেক করতে দাও ...
jrochPoint

1
বাহ, আমি মনে করি আপনি ঠিক বলেছেন - এগুলি ফাইল সিস্টেমে লিখিত, তবে এটি দেখতে এর tmp/cacheচেয়ে ভাল লাগে public/assets, তাই ওয়েব সার্ভার দেখতে পারে এমন কোনও জায়গা নয়, তারা এখনও রেল অ্যাপ্লিকেশন দ্বারা পরিবেশন করা হবে না ওয়েব সার্ভার বাজে কথা। এটা কি ঠিক আছে?
jrochPoint

সঠিক। ওয়েব সার্ভারটি তাদের এখনই বাছাই করার মত দ্রুত হবে না। আপনি যদি আপনার অ্যাপ্লিকেশনের সামনে ক্লাউডফ্রন্টের মতো সিডিএন স্থাপন করেন তবে তা বিবেচ্য নয়
ফ্রেডেরিক চেং

1

সেট config.asset.compile = false

আপনার জেমফাইলে যুক্ত করুন

group :assets do gem 'turbo-sprockets-rails3' end

বান্ডিল ইনস্টল করুন

চালান rake assets:precompile

তারপরে আপনার সার্ভারটি শুরু করুন


যতদূর আমি config.asset.compile = true in production.rbফাইল সেট করেছি , কারণ সেখানে কোনও প্রাক-পরিপূর্ণ প্রক্রিয়া যুক্ত করা হয়নি। যার ফলে আমরা যখনই সার্ভার শুরু করি তখন পৃষ্ঠাটি লোড হতে খুব বেশি সময় লাগে (যখন অনুরোধটি অনুরোধটি প্রক্রিয়াকরণ করে এবং সম্পদ সংকলন করে উভয়ই আঘাত করে)। এখন আমি turbo-sprockets-rails3জেমফাইলে অন্তর্ভুক্ত করেছি এবং কমান্ডটি rake assets:precompileচালাচ্ছি এটির পূর্বে সম্পদগুলি সংকলন করা। এখন আমি config.asset.compile = false in production.rbসার্ভারটি সেট এবং শুরু করি, কোনও বিলম্ব ছাড়াই পৃষ্ঠা লোড হচ্ছে। (সম্পদ সংকলন ব্যতীত কেবল অনুরোধটি প্রক্রিয়াকরণ করা হচ্ছে)
মোহাম্মদ সালেম

2
মূল্য এই বলে যে turbo-sprockets-rails3রুবি 3 শুধুমাত্র প্রয়োজনীয়
আন্দ্রে Figueiredo

0

সরকারী গাইড থেকে :

প্রথম অনুরোধে সম্পদগুলি উপরের বিকাশের হিসাবে বর্ণিত হিসাবে সংকলন এবং ক্যাশে করা হয় এবং সাহায্যকারীদের ব্যবহৃত ম্যানিফেস্ট নামগুলি এমডি 5 হ্যাশ অন্তর্ভুক্ত করতে পরিবর্তিত হয়।

স্প্রোকেটস ক্যাশে-নিয়ন্ত্রণ HTTP শিরোনামকে সর্বাধিক বয়স = 31536000 এ সেট করে। এটি আপনার সার্ভার এবং ক্লায়েন্ট ব্রাউজারের মধ্যে থাকা সমস্ত ক্যাশে সিগন্যাল করে যে এই সামগ্রী (ফাইলটি পরিবেশন করা) 1 বছরের জন্য ক্যাশে রাখা যেতে পারে। এর প্রভাব হ'ল আপনার সার্ভার থেকে এই সম্পদের জন্য অনুরোধের সংখ্যা হ্রাস করা; স্থানীয় ব্রাউজার ক্যাশে বা কিছু মধ্যবর্তী ক্যাশে থাকার সম্পত্তির ভাল সম্ভাবনা রয়েছে।

এই মোডটি বেশি মেমরি ব্যবহার করে, ডিফল্টের চেয়ে দরিদ্র সম্পাদন করে এবং প্রস্তাবিত হয় না।

এছাড়াও, precompile পদক্ষেপ যদি আপনি ব্যবহার এ সব কষ্ট নয় Capistrano আপনার স্থাপন জন্য। এটি আপনার জন্য এটি যত্ন নেয়। আপনি শুধু চালান

cap deploy

বা (আপনার সেটআপের উপর নির্ভর করে)

cap production deploy

এবং আপনি সব প্রস্তুত। আপনি যদি এখনও এটি ব্যবহার না করেন তবে আমি এটি চেক করার পরামর্শ দিচ্ছি।


তাহলে আপনি কি মনে করেন অফিসিয়াল গাইডের থেকে ভাষাটি আমার সাথে একমত? আমি সেই গাইডটি দেখেছি, আমি এটিরপরে কী প্রস্তাব দিচ্ছি তার অর্থ যদি হয় তবে আমি নিশ্চিত নই, আপনি কী ভাবেন? এটাই আমার প্রশ্ন।
jrochPoint

হ্যাঁ, আপনি মূলত একই কথা বলছেন। আমি আপনাকে লাইভ সংকলন চালু না করার পরামর্শ দিই।
সার্জিও টুলেন্টসেভ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.