إطار عمل للسكريبت لإعادة ترتيب المواضيع والفئات

لكتابة نص برمجي لإعادة ترتيب Discourse كبير بالتعاون مع قيادة موقعي، قمت بكتابة إطار عمل بسيط لتجميع مجموعة من النصوص البرمجية الصغيرة بلغة Ruby ليتم تشغيلها من ملف تكوين YAML. بهذه الطريقة، يمكنني استعادة نسخة احتياطية على موقع تجريبي، وتشغيل النص البرمجي الخاص بي، والحصول على ملاحظات، وتغيير بضعة أسطر من YAML، واستعادة النسخة الاحتياطية، وتشغيل النص البرمجي بتكوين جديد، والتكرار حتى الرضا.

لدي ما يقرب من 600 سطر من التكوين لموقعي، والقيام بذلك عن طريق التلاعب اليدوي من خلال واجهة المستخدم لن يحدث. لن يحدث ذلك مرة واحدة، ناهيك عن مرات عديدة للحصول عليه بشكل صحيح. أعرف هذا لأن المرة الأخيرة التي اقترحت فيها إجراء تغييرات واسعة النطاق، استسلمت حرفيًا في محاولة القيام بذلك. على النقيض من ذلك، مع هذا النص البرمجي، يمكنني الآن إكمال الدورة بأكملها في دقائق قليلة لكل تكرار، على الرغم من أن الموقع يحتوي على حوالي نصف مليون مشاركة وأكثر من 100 فئة. هذا يسمح لي بالحصول على ملاحظات سريعة من قيادة موقعي، وسأكون مستعدًا لترحيل موقعي بسرعة.

مزيد من الوثائق التفصيلية موجودة في ملف README في المستودع مع الكود:

:warning: هذا النص البرمجي لا يقوم بأي فحص للأخطاء. من الجنون تقريبًا تشغيله على موقعك المباشر. إنه مخصص للتشغيل على موقع تجريبي، والتحقق من النتيجة، ثم نقله إلى الموقع المباشر. بصفتي المؤلف، ما زلت أنوي تشغيله بهذه الطريقة. إذا قمت بتشغيله مباشرة على موقع مباشر، فستحتفظ بجميع القطع عندما يتعطل. :warning:

من الوثائق، قد يبدو ملف التكوين كالتالي:

---
- describe:
    context: Old Name
    category: 7
    name: New Name
    description: New description of category
    slug: new-slug
- movePosts:
    context: move only faq posts from the Support category to the Documentation category
    source: 3 # Support category ID
    target: 6 # Documentation category ID
    withTag: faq
    hide: false # do not hide the Support category when done
- movePosts:
    context: consolidate How-To category into documentation with how-to tag
    source: 8 # How-To category ID
    target: 6 # Documentation category ID
    addTag: how-to
    hide: true # hide the old How-To category, visible only to Admin

قد يبدو ناتج التقدم أثناء تشغيله كالتالي.

==========
Move hidden categories out of the way so they don't clutter admin view
setHiddenCategory: {:category=>11}
==========
Rename Old Name to New Name
describe: {:category=>7, :name=>"New Name", :description=>"New description of category", :slug=>"new-slug"}
==========
move only faq posts from the Support category to the Documentation category
movePosts: {:source=>3, :withTag=>"faq", :target=>6}
==========

للاستخدام، ضع ملف YAML الخاص بك في /var/discourse/shared/app/tmp/rearrange.yaml ثم:

cd /var/discourse
./launcher enter app
git clone https://github.com/johnsonm/discourse-site-rearranger.git script/discourse-site-rearranger
ruby script/discourse-site-rearranger/rearrange.rb /shared/tmp/rearrange.yaml

ومع ذلك، من المحتمل بشكل معقول أن هذا النص البرمجي لن يفعل كل ما تحتاجه تمامًا. إنه حقًا إطار عمل يجعل من السهل جدًا إضافة إجراءات جديدة تعمل على أتمتة المزيد من جوانب تعديل الموقع المبرمج ببضعة أسطر من الكود. كل ما عليك فعله هو تعريف طريقة واحدة ببضعة أسطر من الكود، وستتمكن من استدعائها بشكل صحيح من ملف YAML.

هل كنت تفكر في تحسين تنظيم موقعك، ولكنك تراجعت عن استخدام واجهة المستخدم، أو تتساءل كيف تثق في أنك ستتمكن من تكرار اختباراتك على موقع تجريبي لإجراء تغييرات مباشرة؟ ألق نظرة وأخبرني برأيك!

5 إعجابات

أنا أستخدم هذا البرنامج النصي لإنشاء موقع اختبار، كنسخة طبق الأصل من موقعي الرئيسي. الدقة البصرية العالية هي جزء من الهدف ولكن يمكن أن تجعل من السهل نشر شيء عن طريق الخطأ في الموقع الخاطئ أثناء مراجعة التغييرات، وجعل هذه المنشورات العرضية تُفقد في المرة التالية التي أقوم فيها بتحديث موقع الاختبار.

لقد جعلت موقع الاختبار للقراءة فقط عندما طلبت ملاحظات عامة. ولكن تم تعطيل تسجيل الدخول أثناء وجود الموقع في وضع القراءة فقط، لذلك لم يتمكنوا من تسجيل الدخول عندما طلبت منهم ذلك.

لقد أضفت إجراءً جديدًا publicCategoriesReadonly يجعل الفئات المرئية للمجهولين قابلة للكتابة فقط بواسطة :admins و :readonly بواسطة :everyone للسماح للأشخاص بتسجيل الدخول والتجول، ولكن المساعدة في تجنب النشر عن طريق الخطأ في الموقع الخاطئ. الآن الموقع ككل ليس في وضع القراءة فقط، ولكن الفئات العامة كذلك.

من الممكن الإشارة إلى الفئات كعلامات تصنيف باستخدام الأسماء المختصرة. يسمح هذا البرنامج النصي بنقل محتوى الفئات معًا وتغيير الأسماء المختصرة، مما سيجعل المنشورات السابقة لا ترتبط بعد إعادة الخبز. (قبل إعادة الخبز، كانت عمليات إعادة توجيه الروابط الدائمة تجعل الروابط تعمل.)

لقد قمت الآن بتحديث البرنامج النصي لتتبع العلامات قبل وبعد الترحيل وإعادة تعيين الإشارات إلى الفئات المتغيرة في المنشورات.

لقد أضفت إجراء migrateRetortToReactions إلى الإطار لمن لديهم Retort مثبتًا ويرغبون في الانتقال إلى مكون إضافي مدعوم.

إعجابَين (2)

رائع! هذا خبر رائع. سيكون من الرائع لو تمكن شخص ما من جعله مهمة “rake” وتقديمه إلى إضافة “reactions”.

سألقي نظرة عليه قريبًا.

إعجاب واحد (1)

يبدو لي أن وجودها كمهمة “rake” في المكون الإضافي أمر ذكي.

لقد قمت بالتوقيع على اتفاقية ترخيص المساهمين (CDCK CLA) حتى لا تعيق أي مصلحة حقوق نشر لي في العمل الناتج، ويمكن وضعها تحت نفس ترخيص المكون الإضافي نفسه.

أيضًا، يمكنني أن أتخيل أنني ارتكبت خطأ؛ إذا وجدت أي شيء خاطئ فيه، أود أن أعرف عنه لأنني أخطط لتشغيل هذا البرنامج النصي على موقعي الخاص في الأسابيع القليلة القادمة. :smiley:

على نطاق أوسع، إذا وجدت هذا الإطار مفيدًا لعملك في دعم تثبيتات Discourse ولكنك ترغب في المزيد من معالجة الأخطاء، فسأقبل طلبات السحب (PRs). أريد فقط التأكد من أن أي طلب سحب إليها يأتي من شخص وقع على اتفاقية CLA ويوافق على أنه يمكن دمج أي أجزاء مفيدة منه في Discourse الرسمي، وهو ما أعرف أنه صحيح بالنسبة لك…

إعجابَين (2)

اكتشفت في موضوع Retort أن لدى @angus فرعًا يحتوي على تحويل مدفوع بواجهة المستخدم، والذي فاتني تمامًا.

يغوص برنامجي في التفاصيل الداخلية التي يمكن أن تتغير في يوم من الأيام، وبمجرد أن أنتهي من تحويلاتي باستخدام هذا البرنامج النصي لن ألاحظ إذا تغيرت تلك التفاصيل الداخلية. حاولت أولاً القيام بذلك “بالطريقة الصحيحة” ولكني اكتشفت أن إضافة التفاعلات لا تكشف عن واجهة تمكن هذا. @angus يأخذ وجهة نظر أطول:

@pfaffman إذا قمت بإنشاء مهمة rake، فقد ترغب في وضعها في طلب سحب (PR) يقوم أيضًا بإجراء التغييرات على الواجهات بحيث يمكن تمرير created_by، على سبيل المثال، بالإضافة إلى الصمت، بدلاً من استخدام “الباب الخلفي” الذي استخدمته. عند هذه النقطة، ستكون مهمة rake موجودة لعمليات الترحيل من سطر الأوامر، وستفتح في نفس الوقت @angus للقيام بترحيل مدفوع بواجهة المستخدم.