تثبيت gem مستند إلى git من إضافة discourse

أولاً وقبل كل شيء، أنا جديد تمامًا في تطوير إضافات Ruby on Rails و Discourse، لذا إذا كان هناك اتجاه أفضل، فسأكون ممتنًا لذلك.

نظرة عامة

لدي نسخة معدلة داخلية من Discourse (discourse-ldap-auth) أقوم بإحضارها عبر استنساخ git. تتطلب هذه النسخة المعدلة من المكون الإضافي نسخة معدلة من Gem (omniauth-ldap) أقوم بإحضارها عبر Gemfile عن طريق إلحاق عبارة gem بعنوان URL داخلي لـ git في خطاف after_bundle_exec الخاص بالتطبيق. يفشل التطبيق في البدء أثناء إعادة البناء لأنه لا يمكنه العثور على الـ gem، على الرغم من أن الـ gem يبدو أنه تم تثبيته بنجاح في وقت سابق في مخرجات إعادة البناء.

التفاصيل

لدينا نسخة Discourse داخلية قيد التشغيل لفترة طويلة حيث كان يُطلب من المستخدمين التسجيل باستخدام بريدهم الإلكتروني الخاص بالشركة. أضفنا مؤخرًا المكون الإضافي discourse-ldap-auth لاستخدام نفس تسجيل الدخول مثل مواقع الإنترانت الأخرى. يعمل هذا التكوين، ولكن المطالبات للمستخدمين مربكة. تتطلب معظم مواقع الإنترانت الأخرى اسم مستخدم، ولكن نسخة Discourse الخاصة بنا تتطلب عنوان بريد إلكتروني لربطه بأي حسابات موجودة. أود تغيير الحقول للمطالبة بعنوان بريد إلكتروني.

omniauth-ldap، الذي يبدو أنه مصدر نص النموذج، لا يدعم تخصيص الحقول مثل المكونات الإضافية الأخرى لـ Discourse. لقد قمت بتعديل هذا (و discourse-ldap-auth) داخليًا لإضافة استدعاءات إلى i18n.t على أمل أن أتمكن من تخصيص الحقول نظرًا لأنها خاصة بالمنطقة الآن. النسخة المعدلة تسمى omniauth-ldap-i18n. لقد أضفت هذا إلى app.yml الخاص بي للحصول على النسخة المعدلة من omniauth-ldap في Gemfile:

hooks:
  after_bundle_exec:
    - exec:
        cd: $home
        cmd:
          - echo "gem 'omniauth-ldap-i18n', git:'https://internal-git-service/omniauth-ldap-i18n.git'" >> Gemfile
          - su discourse -c 'bundle config unset deployment'
          - su discourse -c 'bundle install --no-deployment --path vendor/bundle --jobs 4 --without test development'

داخل النسخة المعدلة من discourse-ldap-auth في plugin.rb:

gem 'omniauth-ldap-i18n', '1.0.0'

المخرجات عند إعادة بناء التطبيق:

Using omniauth-ldap-i18n 1.0.0 from https://internal-git-service/omniauth-ldap-i18n.git (at master@c3cb3ed)
Bundle complete! 127 Gemfile dependencies, 187 gems now installed.
Gems in the groups 'test' and 'development' were not installed.
Bundled gems are installed into './vendor/bundle'

مخرجات الخطأ قبل فشل البدء:

I, [2022-09-10T18:18:08.389538 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
ERROR:  Could not find a valid gem 'omniauth-ldap-i18n' (= 1.0.0) in any repository
ERROR:  Possible alternatives: omniauth-ldap-ifpe, omniauth-ldap, omniauth-ldap2, omniauth-aladin, omniauth-aliyun, omniauth-apihub, omniauth-learn, omniauth-lifen, omniauth-7digital, omniauth-aai
I, [2022-09-10T18:18:47.658658 #1]  INFO -- : gem install pyu-ruby-sasl -v 0.0.3.3 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install
Successfully installed pyu-ruby-sasl-0.0.3.3
1 gem installed
gem install rubyntlm -v 0.6.3 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install
Successfully installed rubyntlm-0.6.3
1 gem installed
gem install net-ldap -v 0.17.1 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install
Successfully installed net-ldap-0.17.1
1 gem installed
gem install omniauth-ldap-i18n -v 1.0.0 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install

You are specifying the gem omniauth-ldap-i18n in /var/www/discourse/plugins/discourse-ldap-auth/plugin.rb, however it does not exist!
Looked for: /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6/specifications/omniauth-ldap-i18n-1.0.0.gemspec

إعجابَين (2)

سيؤدي استخدام هذا في ملف plugin.rb إلى محاولة جلب الـ gem دائمًا من Rubygems - ولن يستخدم الإصدار المثبت محليًا. أعتقد أن خياراتك هي:

  1. قم بدفع نسختك المخصصة من الـ gem إلى rubygems، وأزل خدعة >> Gemfile، واستخدم واجهة برمجة تطبيقات gem في plugin.rb لتثبيتها.

  2. أزل خدعة >> Gemfile، وقم بإعداد خادم rubygems خاص وقم بالتثبيت مثل:

    gem 'omniauth-ldap-i18n', '1.0.0', source: "https://mygemserver.example.com"
    
  3. أضف دعم Git إلى محمل الـ gem الخاص بالإضافات لدينا. إذا كان بإمكانك القيام بذلك دون التأثير على الوظائف الحالية، فسيكون هذا pr-welcome

  4. قم بإزالة استدعاء الدالة gem من plugin.rb. نظرًا لأن لديك خدعة >> Gemfile، يجب أن يكون الـ gem متاحًا تلقائيًا داخل Discourse. لكنني أود التأكيد على أن هذه خدعة - لا يمكننا ضمان أن تجاوز الملفات الأساسية بهذه الطريقة سيعمل بشكل مثالي إلى الأبد.

5 إعجابات

شكراً لك! بما أن هذا لا يزال قيد التطوير، سأبدأ بخادم rubygems الخاص حتى أتمكن من إثبات أنه سيعمل.

أنا فضولي بشأن سبب كون طريقة >> Gemfile هي حل بديل. يتم استخدامها في العديد من الملفات في templates/import/*.yml للجواهر التي تتطلب إعدادًا إضافيًا. هل يعتبر هذا الأسلوب محظورًا للتكوينات العادية مثل هذه؟

إعجابَين (2)

عندما تقوم بتعديل Gemfile في وقت التشغيل، فهذا يعني أنه سيضيف/يغير أيضًا أشياء في Gemfile.lock. هذا يعني أن التبعيات/الإصدارات التي تستخدمها في الإنتاج لا تتطابق مع الإصدارات التي نختبرها في Discourse.

مثير للاهتمام - لم أكن على علم بذلك. أفترض أن المخاطر أقل بكثير بالنسبة لقوالب “الاستيراد”، نظرًا لأنها تستخدم لفترة قصيرة فقط أثناء ترحيل الموقع. ومع ذلك، ما زلت لا أوصي باستخدام هذه التقنية في قالب “إنتاج” - أي من الخيارات الثلاثة الأخرى ستكون أنظف بكثير.

5 إعجابات

أوه، هناك شيء آخر: أنا متأكد من أن خدعة >> Gemfile ستؤدي إلى فشل التحديثات عبر واجهة المستخدم /admin/upgrade عندما نغير ملف Gemfile الأساسي. (التغييرات المحلية ستسبب تعارضًا في git عند محاولة سحب التحديث)

3 إعجابات