الاتساق في التدقيق اللغوي

أقسم أنني نسخت كل إعدادات التحليل الثابت (lint) من discourse-plugin-skeleton إلى الإضافة الخاصة بي وعندما أقوم بتشغيل

pnpm prettier  --write "assets/**/*.{scss,js,gjs,hbs}"

في دليل الإضافة الخاص بي، أحصل على شيء مختلف عما أحصل عليه عند تشغيل

./bin/lint  --fix plugins/discourse-pfaffmanager/assets/**/*.{scss,js,gjs,hbs}

في دليل نواة Discourse.

كما هو متوقع، على ما يبدو، فإن الأمر الثاني هو الذي يتطابق مع ما يحدث عند تشغيل إجراءات GitHub.

ما أريده حقًا هو أن يحدث الشيء الصحيح عند الحفظ في VSCode، وهو ما أنا متأكد تمامًا أنه مشكلة أخرى.

3 إعجابات

نعم @cvx / @david

لقد لاحظت هذا أيضًا… التدقيق النحوي (linting) في الإضافات (plugins) هو مادة متفرقة (snowflake material)، ولدينا فروع للنمط القديم والجديد للتدقيق النحوي في التكامل المستمر (CI) ونتطلب الكثير من الإعداد في المستودع.

أعتقد أن هدفًا رائعًا هو إصلاحه ليعمل bin/lint للإضافات والسمات (themes) أيضًا. لم نقم بتنفيذ ذلك بعد، فهو يعمل فقط مع الإضافات الأساسية (core) والإضافات الأساسية.

إعجابَين (2)

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

من المحتمل أن نجعل bin/lint يعمل - سيتعين عليه الانتقال (cd) إلى دليل الإضافة/السمة، وتشغيل pnpm i، ثم تشغيل أي أوامر تدقيق نحوي في سياق ذلك الدليل.

يجب أن يحدث ذلك. يستخدم معظم أعضاء فريقنا VSCode (أو مشتقات VSCode)، لذلك هذا ما نُحسّن لأجله. ستبحث إضافات Eslint و Prettier لـ VSCode عن التثبيت والتكوين “الأقرب” لملف معين.

هل قمت بتشغيل pnpm i في دليل السمة/الإضافة؟ هذا مطلوب لتثبيت تبعيات التدقيق النحوي الخاصة به، حتى يتمكن VSCode من العثور على الشيء الصحيح.

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

تحولات مثيرة للاهتمام

  • السماح له بتشغيل قواعد النواة اختياريًا
  • السماح له بإعادة تكوين الإعدادات الحالية لتشغيل قواعد النواة

ما هي فائدة ذلك؟ :sweat_smile:
إن تدقيق السمات/الإضافات (Theme/plugin linting) يختلف جوهريًا عن النواة (core). لدينا قواعد خاصة بالسمات/الإضافات. تمتلك السمات متغيرات عامة سحرية خاصة بها يحتاج ESLint إلى معرفتها (themePrefix/settings)

نحن حريصون جدًا على الحفاظ على هذا، وتوثيقه في مستودعات هيكل السمات/الإضافات (theme/plugin-skeleton repos)، ونشر التغييرات بشكل منهجي عبر طلبات السحب الجماعية (mass-pr).

إعجابَين (2)

كأداة للترقية الذاتية، ولكنني أتفهم تمامًا أن لدينا أنظمة أخرى

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

بالمناسبة، عندما أقول إن لديهم إعدادات مختلفة، لا أعني أننا نكرر الإعدادات في كل مكان. لدينا حزمة إعدادات التدقيق اللغوي مُصنَّفة بالإصدارات تتضمن إعدادات مشتركة لـ prettier و eslint و stylelint و ember-template-lint. عادةً ما يكون ترقية السمة/الإضافة إلى أحدث القواعد مجرد مسألة رفع إصدار lint-configs في package.json.

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

لكنني متأكد تمامًا أنه عندما أتبع التدقيق النحوي الذي يتم في الإضافة، تفشل اختبارات التدقيق النحوي في إجراء GitHub.

آها!!! يبدو أن pnpm i هو السحر الذي أفتقده. لقد أضفت pnpm i إلى النص البرمجي الخاص بي الذي يقوم بتحديث نواة discourse وتلك التي تقوم بالتدقيق النحوي. . .

لذا إليك ما يفعله النص البرمجي الخاص بي الآن:

if [[ "$ARG" == "eslint" ]]
then
  # انظر https://github.com/discourse/.github/blob/main/.github/workflows/discourse-plugin.yml
  if [ -f plugin.rb ]
  then
    echo "التدقيق النحوي للدليل الحالي."
  else
    echo "ليس على إضافة. استخدام $DEFAULT_PLUGIN"
    cd $DEFAULT_PLUGIN
  fi
  echo "التدقيق النحوي لـ $(pwd)"
  #cd /home/pfaffman/src/literatecomputing/discourse-display-email
  # pnpm install
  echo "القيام بـ `pnpm i`"
  pnpm -i

  echo -n ESLINT. . .
  pnpm eslint --no-error-on-unmatched-pattern {test,assets,admin/assets}/javascripts
  exit_code="?"
  if [[ $exit_code -ne 0  ]]
  then
    echo "كان eslint غير سعيد -- $exit_code -- محاولة الإصلاح"
    pnpm eslint --fix --no-error-on-unmatched-pattern {test,assets,admin/assets}/javascripts
    exit_code="?"
    if [[ $exit_code -ne 0  ]]
    then
      echo "كان eslint لا يزال غير سعيد -- $exit_code -- انتهت اللعبة"
      exit
    fi
  fi

  echo انتهى ESLINT.

  ## styllint

  echo -n STYLELINT . . .
  pnpm stylelint --allow-empty-input "assets/**/*.scss"
  exit_code="?"
    if [[ $exit_code -ne 0  ]]
    then
      echo "stylelint غير سعيد. محاولة الإصلاح . . . "
    fi
  pnpm stylelint --fix --allow-empty-input "assets/**/*.scss"
  pnpm stylelint --allow-empty-input "assets/**/*.scss"
  exit_code="?"
    if [[ $exit_code -ne 0  ]]
    then
      echo "stylelint لا يزال غير سعيد. هذا محزن. انتهت اللعبة."
      exit
    fi
  echo "تم!"

  ## نهاية stylelint

  ## PRETTIER

  echo -n "Prettier . . . "
  if [ -n "$(find assets -type f \( -name "*.scss" -or -name "*.js" -or -name "*.gjs" -or -name "*.hbs" \) 2>/dev/null)" ]; then
    #pnpm prettier --write                  'assets/**/*.{scss,js,gjs,es6,hbs}'
    # echo "القيام بـ pnpm prettier --write --log-level warn assets/**/*.{scss,js,gjs,hbs}"
    pnpm prettier --write --log-level error "assets/**/*.{scss,js,gjs,hbs}"
    if [[ $? -ne 0  ]]
    then
      echo "قام prettier assets بشيء ما!!! -- $?"
      sleep 5
    fi
  fi
  if [ -n "$(find admin/assets -type f \( -name "*.scss" -or -name "*.js" -or -name "*.gjs" -or -name "*.hbs" \) 2>/dev/null)" ]; then
    #pnpm prettier --write                  'assets/**/*.{scss,js,gjs,es6,hbs}'
    # echo "القيام بـ pnpm prettier --write --log-level warn admin/assets/**/*.{scss,js,gjs,hbs}"
    pnpm prettier --write --log-level log "assets/**/*.{scss,js,gjs,es6,hbs}"
    if [[ $? -ne 0  ]]
    then
      echo "قام prettier admin/assets بشيء ما!!! -- $?"
      pnpm prettier --check --log-level log "assets/**/*.{scss,js,gjs,es6,hbs}"
    fi
  fi
  if [ -n "$(find test -type f \( -name "*.js" -or -name "*.gjs" \) 2>/dev/null)" ]; then
    #pnpm prettier --write                  'assets/**/*.{scss,js,gjs,es6,hbs}'
    # echo "القيام بـ pnpm prettier --write --log-level warn assets/**/*.{scss,js,gjs,es6,hbs}"
    pnpm prettier --write --log-level warn "test/**/*.{js,gjs}"
    if [[ $? -ne 0  ]]
    then
      echo "قام prettier test بشيء ما!!! -- $?"
      pnpm prettier --check --loglevel log "test/**/*.{js,gjs}"
    fi
  fi
  echo "تم الانتهاء من prettier"

  echo "ember-template-lint"
  pnpm ember-template-lint --fix --no-error-on-unmatched-pattern assets/javascripts admin/assets/javascripts
  exit_code="?"
    if [[ $exit_code -ne 0  ]]
    then
      echo "تم الانتهاء من ember-template-lint --fix --no-error-on-unmatched-pattern assets/javascripts -- مع $exit_code"
      echo sleep 5
      sleep 5
    fi
  #bundle exec stree write Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')
  bundle exec stree check Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')
  exit_code="?"
    if [[ $exit_code -ne 0  ]]
    then
      echo "stree غير سعيد. محاولة الإصلاح في ثانيتين . .. "
      sleep 2
      echo "ها نحن ذا!!!"
      bundle exec stree write Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')
    fi
  bundle exec stree check Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')
  exit_code="?"
    if [[ $exit_code -ne 0  ]]
    then
      echo "stree لا يزال غير سعيد. هذا محزن. الانتظار لجعلك أكثر حزنًا"
      sleep 15
    fi
  echo تم الانتهاء من stree

  echo "rubocop!"
  bundle exec rubocop -A $(find . -name "*.rb"|grep -v gems)
  exit_code="?"
  if [[ $exit_code -ne 0  ]]
  then
    echo "تم الانتهاء من rubocop -- $exit_code"
    sleep 15
  fi
  exit
fi


ولكن لدي أيضًا هذا، والذي أعتقد أنه يعمل تقريبًا بنفس الطريقة:

if [[ "$ARG" ==  "lint" ]]
then
  cd ~/src/discourse-repos/discourse
  find plugins/discourse-pfaffmanager/assets -type f \( -name "*.scss" -o -name "*.js" -o -name "*.gjs" -o -name "*.hbs" -o -name "*.rb" \) -exec ./bin/lint --fix {} +
  cd -
fi

الفرق الوحيد الآن على ما يبدو هو أن تدقيق النواة النحوي غير سعيد بشأن هذا (وأعتقد أنني أفهم سبب عثور النواة عليه وعدم عثور الإضافة عليه، ولا يوجد أي ضرر في إصلاح تلك الإهمالات في وقت مبكر بدلاً من وقت لاحق):


/home/pfaffman/src/discourse-repos/discourse/plugins/discourse-pfaffmanager/assets/javascripts/discourse/components/modal/really-delete.gjs
  2:8  error  Use Glimmer components(@glimmer/component) instead of classic components(@ember/component)  ember/no-classic-components

✖ 1 problem (1 error, 0 warnings)

وإذا استخدمت bin/lint فلن أضطر للقلق بشأن تغيير شيء ما في التدقيق النحوي يتطلب تحديث نصي المكون من 54 سطرًا. أليس كذلك؟

انتظر. توثيقها أين في مستودعات الهيكل؟

أود الحصول على بعض الإرشادات حول كيفية نشر التغييرات بشكل منهجي، على الرغم من أنني أتفهم أن مجموعتي الصغيرة من الأشياء ليست مشكلتك حقًا. . . هذا لا ينتمي حقًا إلى هنا، لكنني حاولت مرتين فهم mass-pr، ولكن لم أنجح بعد. عادةً ما أقوم بنسخ بعض ملفات .whatever بشكل دوري من سحب حديث للهيكل وآمل أن يسير الأمر على ما يرام.

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

والعديد منها يفشل بشيء مثل sed: can’t read s/default.yml/stree-compat.yml/: No such file or directory ؟ لأنها لا تستنسخ مستودعات الهيكل؟ (سأبدأ موضوعًا في مكان مناسب لذلك عندما أحصل على فرصة).

يستخدم bin/lint إعدادات التدقيق اللغوي الأساسية، وبالتالي لا يدعم السمات (themes) أو الإضافات (plugins). إذا استخدمته، فمن المحتمل أن تحصل على إخفاقات في اختبارات التكامل المستمر (CI) الخاصة بالسمة/الإضافة الخاصة بك. على سبيل المثال، حتى الترقيات الصغيرة جدًا لـ prettier يمكن أن تحدث تغييرات طفيفة في التعامل مع المسافات البيضاء.

نعم، هذا هو جوهر ما تفعله برامج السحب الجماعي (mass-pr scripts) :+1:

update-linting.sh هو البرنامج الذي تريده. البرامج النصية الأخرى مخصصة لنشرات أكثر تخصصًا.

يمكنك ذلك. أو يمكنك ببساطة إعادة تشغيله بين الحين والآخر، عندما تريد تحديث إعدادات التدقيق اللغوي لسمتك/إضافتك. نظرًا لأن الإعداد مكتفٍ ذاتيًا بالكامل، فإن التغيير في النواة (core) لن يؤثر أبدًا على التدقيق اللغوي في السمات/الإضافات الخاصة بك - فهما منفصلان تمامًا.

رائع! لذا أحتاج فقط إلى تشغيل هذا بين الحين والآخر وسيقوم بتحديث جميع عمليات التدقيق النحوي. أما البقية فهي للقيام بأشياء سحرية مثل المساعدة في الترحيل إلى إمبر (Ember) جديد وما إلى ذلك؟ ربما بدأت أفهم ويمكنني إعداد قائمة بالمستودعات كما في المثال.

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

نعم، لكني أحب قضاء 5 ساعات في أتمتة مهمة يمكنني القيام بها يدويًا في 3 دقائق ويبدو أن هذا هو السبيل الجيد للقيام بذلك. :rofl: