Lintingの一貫性

discourse-plugin-skeleton からすべてのリンター関連のものをプラグインにコピーしたと誓いますが、プラグインディレクトリで

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

を実行すると、discourse コアディレクトリで

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

を実行したときとは異なる結果になります。

予想通り、後者の方が GitHub Actions が実行するときと一致します。

私が本当に望んでいるのは、VSCode で保存したときに「正しいこと」が起こることですが、それはまた別の問題だと確信しています。

「いいね!」 3

ええ、@cvx / @davidさん

私もこれに気づきました… プラグインでのリンティングはすべてスノーフレーク(個別対応)の材料になっており、CIでは古いスタイルと新しいスタイルのリンティングのためにブランチがあり、リポジトリで多くのセットアップが必要です。

目標は、bin/lint がプラグインやテーマでも機能するように修正することだと思います。まだ実装されておらず、コアとコアプラグインでのみ機能します。

「いいね!」 2

確かに、テーマ/プラグインのリンティングはコアから意図的に切り離されています。それらはリンティングツールの異なるバージョンと設定を実行している可能性があります。これは、すべてのリポジトリのリンティングを突然壊すことなく変更をロールアウトできるようにするために不可欠です。

おそらく bin/lint を機能させることができます。それはプラグイン/テーマディレクトリに cd し、pnpm i を実行し、その後そのディレクトリのコンテキストでリンティングコマンドを実行する必要があります。

そうなるはずです。私たちのチームのほとんどはVSCode(またはVSCodeの派生製品)を使用しているため、それが私たちが最適化しているものです。EslintとPrettierのVSCodeプラグインは、特定のファイルに対して「最も近い」インストールと設定を検索します。

テーマ/プラグインディレクトリで pnpm i を実行しましたか?それはそのリンティング依存関係をインストールするために必要であり、それによってVSCodeが正しいものを見つけることができます。

「いいね!」 1

興味深い展開

  • コアルールを実行するオプションを許可する
  • コアルールを実行するために既存の設定を再構成できるようにする

それの利点は何でしょうか?:sweat_smile:

テーマ/プラグインのリンティングは、コアとは根本的に異なります。テーマ/プラグイン固有のルールがあります。テーマには、ESLintが知る必要のある独自の魔法のグローバル変数(themePrefix/settings)があります。

私たちはこれを維持することに非常に注意を払っており、テーマ/プラグインスケルトンリポジトリで文書化し、一括プルリクエスト(mass-pr)を通じて変更を体系的に展開しています。

「いいね!」 2

自己アップグレードのツールとしてですが、他のシステムがあることは完全に理解しています。

ああ、なるほど。スケルトンから自動更新するためのスクリプトがこちらにあります。それらを個々のテーマやプラグインで実行しやすくするのは、良いプロジェクトになるかもしれません。

ちなみに、設定が異なると言ったのは、設定を至る所で複製しているという意味ではありません。バージョン管理されたlint configsパッケージがあり、これにはprettier、eslint、stylelint、およびember-template-lintの共有設定が含まれています。テーマ/プラグインを最新のルールにアップグレードするには、通常、package.jsonlint-configsのバージョンを上げるだけで済みます。

「いいね!」 1

しかし、プラグインで行われたリンティングに従うと、GitHubアクションでリンティングテストが失敗すると確信しています。

アハ! pnpm i は私が見逃していた魔法のようです。Discourseコアを更新するスクリプトとリンティングを行うスクリプトに「pnpm i」を追加しました。 . .

それで、私のスクリプトが現在行っていることは次のとおりです。

if [[ \"$ARG\" == \"eslint\" ]]
then
  # See https://github.com/discourse/.github/blob/main/.github/workflows/discourse-plugin.yml
  if [ -f plugin.rb ]
  then
    echo \"Linting current directory.\"
  else
    echo \"Not on a plugin. Using $DEFAULT_PLUGIN\"
    cd $DEFAULT_PLUGIN
  fi
  echo \"LINTING $(pwd)\"
  #cd /home/pfaffman/src/literatecomputing/discourse-display-email
  # pnpm install
  echo \"Doing `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 was unhappy -- $exit_code -- trying to fix\"
    pnpm eslint --fix --no-error-on-unmatched-pattern {test,assets,admin/assets}/javascripts
    exit_code=\"$?\"
    if [[ $exit_code -ne 0  ]]
    then
      echo \"eslint was still unhappy -- $exit_code -- game over\"
      exit
    fi
  fi

  echo ESLINT done.

  ## styllint

  echo -n STYLELINT . . .
  pnpm stylelint --allow-empty-input \"assets/**/*.scss\"
  exit_code=\"$?\"
    if [[ $exit_code -ne 0  ]]
    then
      echo \"stylelint is unhappy. Trying to fix . . . \"
    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 is still unhappy. this is sad. Game over.\"
      exit
    fi
  echo \"DONE!\"

  ## end stylelint

  ## PRETTIER

  echo -n \"Prettier . . . \"
  if [ -n \"$(find assets -type f \\( -name \"*.scss\" -or -name \"*.js\" -or -name \"*.gjs\" -or -name \"*.hbs\" \\) 2\u003e/dev/null)\" ]; then
    #pnpm prettier --write                  'assets/**/*.{scss,js,gjs,es6,hbs}'
    # echo \"doing 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 did something!!! -- $?\"
      sleep 5
    fi
  fi
  if [ -n \"$(find admin/assets -type f \\( -name \"*.scss\" -or -name \"*.js\" -or -name \"*.gjs\" -or -name \"*.hbs\" \\) 2\u003e/dev/null)\" ]; then
    #pnpm prettier --write                  'assets/**/*.{scss,js,gjs,es6,hbs}'
    # echo \"doing 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 did something!!! -- $?\"
      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\u003e/dev/null)\" ]; then
    #pnpm prettier --write                  'assets/**/*.{scss,js,gjs,es6,hbs}'
    # echo \"doing 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 did something!!! -- $?\"
      pnpm prettier --check --loglevel log \"test/**/*.{js,gjs}\"
    fi
  fi
  echo \"Done with 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 \"done with ember-template-lint --fix --no-error-on-unmatched-pattern assets/javascripts -- with $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 is unhappy. Trying to fix in 2 seconds . .. \"
      sleep 2
      echo \"here we go!!!\"
      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 is still unhappy. this is sad. Waiting to make you sadder\"
      sleep 15
    fi
  echo done with stree

  echo \"rubocop!\"
  bundle exec rubocop -A $(find . -name \"*.rb\"|grep -v gems)
  exit_code=\"$?\"
  if [[ $exit_code -ne 0  ]]
  then
    echo \"done with 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 はコアのリンティング設定を使用するため、テーマやプラグインをサポートしていません。これを使用すると、テーマ/プラグインの CI で失敗する可能性があります。例えば、prettier のごくわずかなバージョンのアップグレードでも、空白の処理に微妙な変更が生じる可能性があります。

はい、それは基本的に mass-pr スクリプトが行うことです :+1:

update-linting.sh が必要なスクリプトです。その他のスクリプトは、より専門的なロールアウトのためのものです。

そうすることもできます。または、テーマ/プラグインのリンティング設定を更新したいときに、時々再実行するだけでも構いません。設定は完全に自己完結型であるため、コアでの変更がテーマ/プラグインのリンティングに影響を与えることは決してありません。これらは完全に切り離されています。

なるほど!ということは、時々それを実行するだけで、すべてのリンティングが更新されるということですね。他のものは、新しいEmberへの移行などを助けるような魔法のようなことをするのでしょうか?少しずつ理解してきたようで、例のようにリポジトリのリストを作成できるかもしれません。

了解しました。pnpm i を実行していなかったので、テーマ/プラグインのリンティングが間違ったことを行い、コアのリンティングがGitHubと一致していたため、混乱していました。

ええ、でも、手作業で3分でできるタスクを自動化するのに5時間費やすのが大好きで、これはそのための良い方法のようです。 :rofl: