التخزين المؤقت للأصول الثابتة على Heroku باستخدام Jammit عن طريق تغيير ActionController::Base#page_cache_directory

StackOverflow https://stackoverflow.com/questions/4977780

  •  12-11-2019
  •  | 
  •  

سؤال

أحاول استخدام Jammit لتعبئة CSS وJS لتطبيق Rails المنتشر على Heroku، والذي لا يعمل خارج الصندوق بسبب نظام ملفات Heroku للقراءة فقط.يوصي كل مثال رأيته حول كيفية القيام بذلك ببناء جميع ملفات الأصول المجمعة مسبقًا.نظرًا للنشر المستند إلى Git الخاص بـ Heroku، فهذا يعني أنك بحاجة إلى الالتزام بشكل منفصل بمستودعك في كل مرة تتغير فيها هذه الملفات، وهو حل غير مقبول بالنسبة لي.بدلاً من ذلك، أريد تغيير المسار الذي يستخدمه Jammit لكتابة الحزم المخزنة مؤقتًا #{Rails.root}/tmp/assets (عن طريق تغيير ActionController::Base#page_cache_directory)، وهو قابل للكتابة على Heroku.

ما لا أفهمه هو كيف سيتم استخدام الملفات المخزنة مؤقتًا دون الوصول إلى مكدس Rails في كل مرة، حتى باستخدام المسار الافتراضي للحزم المخزنة مؤقتًا.اسمحوا لي أن أشرح ما أعنيه:

عندما تقوم بتضمين حزمة باستخدام مساعد Jammit، فإنها تبدو كما يلي:

<%= include_javascripts :application %>

الذي ينشئ علامة البرنامج النصي هذه:

<script src="/assets/application.js" type="text/javascript"></script>

عندما يطلب المتصفح عنوان URL هذا، فإن ما يحدث بالفعل هو أنه يتم توجيهه إليه Jammit::Controller#package, ، الذي يعرض محتويات الحزمة إلى المتصفح ثم يكتب نسخة مخبأة إليه #{page_cache_directory}/assets/application.js.الفكرة هي أن هذا الملف المخزن مؤقتًا مبني على الطلب الأول، ويجب أن تخدم الطلبات اللاحقة الملف المخزن مؤقتًا مباشرة دون الاصطدام بمكدس ريلز.لقد بحثت في كود Jammit ولا أرى كيف من المفترض أن يحدث هذا.ما يمنع الطلبات اللاحقة ل /assets/application.js من مجرد التوجيه إلى Jammit::Controller مرة أخرى وعدم استخدام الملف المخزن مؤقتًا أبدًا؟

أعتقد أن هناك برنامجًا وسيطًا لـ Rack في مكان ما لا أرى أنه يخدم الملف إذا كان موجودًا ويعيد توجيه الطلب إلى وحدة التحكم إذا لم يكن موجودًا.إذا كان الأمر كذلك، أين هو هذا الرمز؟وكيف سيعمل عند التغيير ActionController::Base#page_cache_directory (تغيير فعال حيث يكتب Jammit الحزم المخزنة مؤقتًا)؟منذ #{Rails.root}/tmp أعلى جذر المستند العام، ولا يوجد عنوان URL يعين هذا المسار.

هل كانت مفيدة؟

المحلول

سؤال عظيم!لم أقم بإعداد هذا بنفسي، ولكن هذا شيء كنت أنوي النظر فيه، لذا فقد حثتني على القيام بذلك.إليك ما سأحاول (سأجرب بنفسي قريبًا، لكن من المحتمل أنك ستسبقني بذلك).

config.action_controller.page_cache_directory = "#{Rails.root}/tmp/page_cache"

الآن قم بتغيير config.ru الخاص بك إلى:

require ::File.expand_path('../config/environment',  __FILE__)
run Rack::URLMap.new(
   "/"       => Your::App.new,
   "/assets" => Rack::Directory.new("tmp/page_cache/assets"))

فقط تأكد من عدم وجود أي شيء فيه public/assets, ، لأنه لن يتم التقاط ذلك أبدًا.

ملحوظات:

  • هذا بالنسبة للريلز 3لست متأكدًا من الحل ضمن Rails 2.
  • يبدو الأمر كذلك Rack::Directory يضبط رؤوس التحكم في ذاكرة التخزين المؤقت على 12 ساعة حتى يقوم Heroku بتخزين أصولك مؤقتًا في Varnish.لست متأكدًا مما إذا كان Jammit قد قام بتعيين هذا في وحدة التحكم الخاصة به، ولكن حتى إذا لم يفعل ذلك، فسيتم تخزينه مؤقتًا بسرعة كبيرة.
  • مجموعات Heroku أيضًا ENV['TMPDIR'] الآن أيضًا، لذا يمكنك استخدام ذلك بدلاً من ذلك Rails.root + '/tmp' لو كنت تريد.

نصائح أخرى

قد يكون هذا مفيدًا، فهو لجوهرة مختلفة ولكن الفكرة متشابهة وأحاول أن أجعلها تعمل مع مساعدي الأصول البسيطة.

http://devcenter.heroku.com/articles/using-compass

لسوء الحظ، يبدو أنه من الصعب جدًا جعل القضبان تفعل ذلك دون تصحيح/إعادة كتابة وحدة مساعدات الأصول (التي تشبه السباغيتي المقترنة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top