5 পাগল: উত্পাদনে lib ফাইল লোড করুন


128

আমি আমার অ্যাপ্লিকেশনগুলির মধ্যে একটিতে রেলগুলি ৪.২..6 থেকে রেল ৫.০.০ তে আপগ্রেড করেছি। আপগ্রেড গাইড বলছেন, যে Autoload বৈশিষ্ট্য এখন ডিফল্ট ভাবে উৎপাদনে অক্ষম করা হয়েছে।

এখন আমি সর্বদা আমার প্রোডাকশন সার্ভারে ত্রুটি পাই কারণ আমি application.rbফাইলটিতে অটোলোডের সাথে সমস্ত লিবিব ফাইল লোড করি ।

module MyApp
    class Application < Rails::Application
        config.autoload_paths += %W( lib/ )
    end
end

আপাতত, আমি এটি সেট করে ফেলেছি তবে এর config.enable_dependency_loadingথেকে trueআরও ভাল সমাধান পাওয়া যায় কিনা তা অবাক করে দিয়েছি। ডিফল্টরূপে উত্পাদনে অটোলয়েডিং অক্ষম থাকার কোনও কারণ থাকতে হবে।


ক্রেজি জিনিস এবং ডক্স এখনও আপনাকে অটো_লোড করতে বলে। নতুন অ্যাপ্লিকেশনটির জন্য প্রযোজনায় কী ভুল হচ্ছে তা আমি খুব বিভ্রান্ত হয়ে পড়েছিলাম। এবং যেহেতু আমি রেল 5 দিয়ে শিখতে শুরু করেছি আমি মাইগ্রেশন গাইড পড়িনি। আশা করি সমাধান করার জন্য আমি একটি ডক ইস্যু দায়ের করেছি: github.com/rails/rails/issues/27268
akostadinov

1
বিস্ময়করভাবে, আমি দুই ফাইল আছে lib: D: Dir, একটি ফাইল রানটাইম সহজে পাওয়া যায়, কিন্তু অন্য ম্যানুয়ালি প্রয়োজনীয় করতে হবে
বাজিকর

@ তোবিয়াস আপনি কী সমাধানটি শেষ করেছেন?
জিওবয়

কোডটি Validatorsস্বয়ংক্রিয়ভাবে লোড হওয়ায় @ অ্যাপ্লিকেশন / ডিরেক্টরিতে ফোল্ডারে সরাসরি জিওবয় আই গ্রুপ কোড (যেমন )।
টোবিয়াস

এটা সম্পর্কে সঠিক ফাইল পাথ এবং ক্লাস সংজ্ঞা এখানে কি আমার জন্য কাজ পাগল 5.2 হয়: ফাইল পথ: app/services/paylinx/paylinx_service.rbক্লাস সংজ্ঞা: module Paylinx class PaylinxService end end। আমি এই autoload_pathsজিনিস চেষ্টা করেছিলাম । আমার জন্য কাজ করে না।
নমনামনাম

উত্তর:


161

রেল 5 এ যাওয়ার পরে আমার পরিবর্তনের তালিকা:

  1. স্থান libমধ্যে Dir appকারণ অ্যাপ্লিকেশনের ভেতরে সব কোড autoloaded দেব এবং উৎসুক লোড শঙ্কু এবং সবচেয়ে গুরুত্বপূর্ণভাবে হয় autoreloaded উন্নয়নে যাতে আপনি সার্ভার প্রতিটি সময় আপনি পরিবর্তন করতে পুনরায় আরম্ভ করা হবে না।
  2. requireআপনার নিজের ক্লাসের দিকে ইঙ্গিত করে যে কোনও বিবৃতি ভিতরে Removeুকিয়ে ফেলুন libকারণ সেগুলি ফাইল / দির নামকরণ সঠিক এবং যদি আপনি requireবিবৃতি ছেড়ে দেন তবে এটি অটোরিলোডিং ভেঙে দিতে পারে they আরও তথ্য এখানে
  3. config.eager_load = trueকোডটি লোড করার সমস্যাটি ডেভের সাথে উত্সাহিত করতে সমস্ত পরিবেশে সেট করুন ।
  4. Rails.application.eager_load!"বিজ্ঞপ্তি নির্ভরতা" ত্রুটি এড়াতে থ্রেডগুলির সাথে খেলার আগে ব্যবহার করুন ।
  5. আপনার যদি কোনও রুবি / রেল এক্সটেনশান থাকে তবে সেই কোডটি পুরানো libডিরেক্টরিতে রেখে দিন এবং মেনুয়ালি ইনিশিয়ালাইজার থেকে লোড করুন। এটি নিশ্চিত করবে যে আপনার পরবর্তী যুক্তির আগে এটি নির্ভর করতে পারে তার আগে এক্সটেনশনগুলি লোড হয়েছে:

    # config/initializers/extensions.rb
    Dir["#{Rails.root}/lib/ruby_ext/*.rb"].each { |file| require file }
    Dir["#{Rails.root}/lib/rails_ext/*.rb"].each { |file| require file }

8
সুতরাং এখন কিভাবে একটি libফোল্ডার ব্যবহার করে ? আমি libদিরকে দিরের দিকে নিয়ে যাওয়া মানে appএক ধরণের কাজের মতো।
মার্টিন স্বোবদা

3
/app/lib/একটি ফাইল / শ্রেণি স্থাপন করেছে এবং এটি স্বয়ংক্রিয়ভাবে চালিত হচ্ছে না। রেল 5.1, নতুন প্রকল্পে পরীক্ষিত
টিম ক্রেটসকমার

29
আপনি বসন্ত বন্ধ করতে হবে যে এটি লক্ষণীয়। আমি সমস্ত কিছু অ্যাপ / লিবি / এ স্থানান্তরিত করেছি এবং তারপরে আমি কেন কনসোল থেকে আমার ক্লাস ব্যবহার করতে পারি না তা ভেবে কিছুটা সময় নষ্ট করলাম। বসন্ত স্টপ এফটিডব্লু :)
জ্যাকলিন

1
নিম্নলিখিত লাইনটি কোথায় যাবেRails.application.eager_load!
স্টিভেন আগুয়িলার

1
এটি কার্যকর হতে পারে তবে এটি সেরা সমাধান নয়। ফোল্ডার স্ট্রাকচার পাশাপাশি শব্দার্থক। ডিরেক্টরিতে থাকা বিষয়গুলির libচেয়ে প্রকল্পগুলির বিষয়গুলির মধ্যে পৃথকভাবে উপলব্ধি করা ঘনিষ্ঠতা রয়েছে app। অন্যান্য উত্তর বেশ কয়েকটি এই উত্তর চেয়ে ভাল।
সিডবুইটি

84

আমি কেবলমাত্র গিথুব মন্তব্যে আকোস্টাডিনভের উল্লেখের config.eager_load_pathsপরিবর্তে ব্যবহার করেছি config.autoload_paths: https://github.com/rails/rails/issues/13142#issuecomment-275492070

# config.autoload_paths << Rails.root.join('lib')
config.eager_load_paths << Rails.root.join('lib')

এটি উন্নয়ন এবং উত্পাদন পরিবেশে কাজ করে।

ধন্যবাদ জোহান পরামর্শ প্রতিস্থাপন জন্য #{Rails.root}/libসঙ্গে Rails.root.join('lib')!


3
একটি যাদুমন্ত্র মত কাজ করে. আমি সিনট্যাক্সটি পছন্দ করি না তাই এটি এটিকে পরিবর্তন করে config.eager_load_paths << Rails.root.join('lib')
3limin4t0r

2
আমার কাছে এটাই সেরা উত্তর ছিল। আমার প্রকল্পটি স্ক্র্যাচ থেকে রেল 5.2 এ শুরু হয়েছিল এবং ফোল্ডার / লিবটি এখনও / অ্যাপ ফোল্ডারের বাইরে তৈরি করা হয়েছিল। আমি এটিকে সরানোর কোনও ভাল কারণ দেখিনি didn't
সমীর হাদাদ

1
হ্যাঁ, এই কাজ! মনে হচ্ছে রেল ডেভস সত্যিই লিব লোডিং সমস্যার কারণ হিসাবে উপভোগ করছে: পরের বার পর্যন্ত ডি!
ড্যামিয়েন রোচে

কারাগারে 5.2 এর config.eager_load_paths += [Rails.root.join('lib')]পরিবর্তে ব্যবহার config.eager_load_pathsহ'ল কারণ হিমায়িত অ্যারে
উইলিয়াম ওয়াং গ্যারে

আপনি উইলিয়াম ওয়ংগ্যারে কনফিগার করুন.ইগার_লোড_প্যাথগুলি কেবল তখনই পঠনযোগ্য যখন আপনি এটিকে আরম্ভকারীতে পরিবর্তন করার চেষ্টা করবেন। আপনি যখন এতে পাথ যুক্ত করবেন তখন application.rbউভয় পদ্ধতি ব্যবহার করে কাজ করবে।
মিশা জালেউস্কি

31

থ্রেড সুরক্ষার কারণে অটোলয়েডিং উত্পাদন পরিবেশে অক্ষম। লিঙ্কটির জন্য আপনাকে @ Зелёный ধন্যবাদ।

গিথুব-এ প্রস্তাবিত হিসাবে libআমার appডিরেক্টরিতে ফোল্ডারে lib ফাইলগুলি সংরক্ষণ করে আমি এই সমস্যার সমাধান করেছি । ফোল্ডারের প্রতিটি ফোল্ডার স্বয়ংক্রিয়ভাবে রেলগুলি দ্বারা লোড হয়ে যায়।app


6
আপনি যদি গিথুবের উপর দীর্ঘ আলোচনার সূত্র ধরে খোঁড়াখুঁড়ি করতে না চান তবে আপনি এখানে পাতিত ব্যাখ্যাটি খুঁজে পেতে পারেন: collectiveidea.com/blog/archives/2016/07/22/…
আর্নেস্ট

7
আমি ব্যবহার করেছি config.eager_load_paths << "#{Rails.root}/lib", প্রস্তাবিত রেল অ্যাপ স্ট্রাকচার অনুসরণ করতে এটিই ভাল আইএমও।
akostadinov

2
app/libরেলপথের সদস্যগণ লিথ
দিচ্ছেন

4
এর উদ্দেশ্য কী তা সম্পূর্ণরূপে নষ্ট করে দেয় lib। আমি টেন্ডারলভ বা ডিএইচএইচ-এর জন্য অপেক্ষা করতে চাই the এর মধ্যে, আমি (ব্যক্তিগতভাবে) @ লাইভ লুকোমস্কির উত্তরটি আটকে রাখার প্রস্তাব দিই।
জোশ ব্রডি

@ জোশব্রোডি এখন আমার অভিমত আপনার পক্ষে /libডিরেক্টরিটির মোটেই প্রয়োজন হবে না । তৃতীয় পক্ষের libs বেশিরভাগ সময় রত্ন হয় এবং যদি না হয় একটি রত্ন তৈরি করা উচিত। অন্যান্য ফাইলগুলির জন্য, আমি /appডিরেক্টরিতে নির্দিষ্ট ফোল্ডার তৈরি করি । উদাহরণস্বরূপ validators
টোবিয়াস

22

ডিফল্টরূপে উত্পাদনে অটোলয়েডিং অক্ষম থাকার কোনও কারণ থাকতে হবে।

এই সমস্যাটি সম্পর্কে এখানে দীর্ঘ আলোচনা। https://github.com/rails/rails/issues/13142


1
এই আলোচনাটি উত্তম, যদিও দীর্ঘ পঠিত, এই বিষয়টির তথ্যের উত্স যা আমি এসেছি।
জেসন

12

এটি lib অটোরেলোড রাখতে দেয় এবং উত্পাদন পরিবেশেও কাজ করে।

পিএস আমি আমার উত্তরটি পরিবর্তন করেছি, এখন এটি উভয় আগ্রহী - একটি স্বতঃস্ফূর্ত পথগুলিকে যুক্ত করুন, পরিবেশ নির্বিশেষে, কাস্টম পরিবেশেও কাজ করার অনুমতি দেয় (মঞ্চের মতো)

# config/initializers/load_lib.rb
...
config.eager_load_paths << Rails.root.join('lib')
config.autoload_paths << Rails.root.join('lib')
...

2
আপনি কেন এই সমস্যাটি স্থির করে তার উপর প্রসারিত করতে পারেন?
স্টুয়ার্ট.স্ক্লিনার

@ স্টুয়ার্ট.স্ক্লিনার এটি লাইব অটোরলোডের অনুমতি দেয় এবং উত্পাদন পরিবেশেও কাজ করে। পিএস আমি আমার উত্তরটি পরিবর্তন করেছি, এখন এটি উভয়ই আগ্রহী - একটি স্বতঃস্ফূর্ত পথকে যুক্ত করুন, পরিবেশ নির্বিশেষে, কাস্টম পরিবেশেও (মঞ্চের মতো) কাজ করার অনুমতি দেওয়ার জন্য
শ্রদ্ধমা

1
আপনি কি প্রসারিত করতে পারেন (আপনার উত্তরে)? কোড কেবলমাত্র উত্তরটি কেন এটি "সেইভাবে" করা উচিত তা বুঝতে কাউকে সত্যই সহায়তা করে না - আমার যুক্ত করা উচিত আমি কোনও রুবি দেব নই, কেবলমাত্র তাই পরিষ্কার করতে সহায়তা করব। "কেবলমাত্র উত্তর" কোডটিতে কিছু মন্তব্য যুক্ত করা এটিকে কিছু প্রকৃত প্রসঙ্গ দেয়।
স্টুয়ার্ট.স্ক্লিনার

1
@ স্টুয়ার্ট.স্ক্লিনার নিশ্চিত
শ্রোমা

6

শুধু পরিবর্তন config.autoload_paths করার config.eager_load_paths মধ্যে কনফিগ / application.rb ফাইল। কারণ রেলগুলিতে 5 অটোলয়েডিং ডিফল্টরূপে উত্পাদন পরিবেশের জন্য অক্ষম থাকে। আরও তথ্যের জন্য লিঙ্কটি অনুসরণ করুন

 #config.autoload_paths << "#{Rails.root}/lib"
  config.eager_load_paths << Rails.root.join('lib')

এটি পরিবেশ বিকাশ এবং উত্পাদন উভয়ের জন্য কাজ করে।


4

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

# config/application.rb
...
config.paths.add Rails.root.join('lib').to_s, eager_load: true

# as an example of autoload only config
config.paths.add Rails.root.join('domainpack').to_s, autoload: true
...

2

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

এছাড়াও, পুরানো রুট-স্তর লোড করার জন্য ইনিশিয়ালাইজার ব্যবহার libবিকাশের সময় পুনরায় লোডিং বৈশিষ্ট্যটিকে আটকাবে।


0

অ্যাপ্লিকেশনটিতে লাইব ফোল্ডারটি সরানো কোনও সমস্যার সমাধান করতে সহায়তা করেছে, আমার টুইটার এপিআই উত্পাদন হবে না। আমি "অবিচ্ছিন্ন ধ্রুবক টুইটারএপি" পেয়েছি এবং আমার টুইটার এপিআই আমার লিব ফোল্ডারে ছিল। আমার ছিলconfig.autoload_paths += Dir["#{Rails.root}/app/lib"] আমার application.rb কিন্তু এটা ফোল্ডারের সরানোর আগে কাজ করে নি।

এই কৌশলটি


-6

লেবের উত্তর সংক্ষিপ্ত mv lib appকরার জন্য : আমার সমস্ত ছিল যথেষ্ট ছিলlib কোড স্বয়ংক্রিয়ভাবে চালিত / স্বয়ংক্রিয়ভাবে পুনরায় লোড ।

(রেল 6.০.০ বিটা ৩ তবে 5..x রেলগুলিতেও কাজ করা উচিত)

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