単玔さに぀いおの困難チヌムのESLint

小さな玹介。 ほずんどの堎合、この投皿はESLintずは䜕かを知っおいる人にだけ興味深いものですが、それでも私は小さな玹介をしたす。さもなければ、出版物を開くず非垞に怒っお、「あなたが話しおいるxxxを10幎間䜿っおいたす」ずいう蚀葉で始たりたすご存知ですが、xxx.yyyに぀いお曞くこずにしたした。これは誰もやったこずがありたせんが、おそらくずおもクヌルです。」



そのため、 ESLintは、遞択したJavaScript暙準で蚘述されたコヌドの品質を分析できるクヌルなツヌルです。 コヌドをほが均䞀なスタむルにし、愚かな間違いを回避し、芋぀かった問題の倚くを自動的に修正し、倚くの開発ツヌルhello、Jetbrains、私たちはあなたを愛しおいたすず完党に統合できたす。 ちなみに、圌は、他のリンタヌのように、あなたに特定のスタむルを矩務付けたせん。 それどころか-ベストプラクティスから䜕かを遞択し、必芁に応じお倉曎できたす。









アプリケヌションの䞭では、たったく予期しないケヌスを芋぀けるこずができたす。たずえば、リンタヌを自動的に修正するこずでレガシヌコヌドを実行しやすくなり、゚ラヌをそのたた修正するよりもよく芋える最新の暙準になりたす。 その結果、無効な構成䜓が刀明する可胜性がありたすが、私たちの芳察によるず、これは倉換前にうんざりするコヌドがあったこずを意味したす。



䞀般に、2017幎にNode.JSでリンタヌなしで生掻するこずは、片手に座っおメモ垳でコヌドを曞くようなものです。



そしお今日、私は圌が個人ずしおではなく、チヌムずしお効果的に働くためにどのようにそれを実装するこずに決めたかをお話ししたす。



倧䌁業はCIプロセスの䞀郚ずしおリンタヌテストを行っおいたすが、すぐにそれを説明したす。 しかし今のずころ、私たちは䞻な必芁性を認識する必芁がありたす-開発者からのリンタヌの立ち䞊げ、すべおがうたくいき、ほが同じように動䜜するこずを保蚌したす。



どうやら-それは䜕ですか、プロゞェクトに.eslintrc.jsonを远加しお、始めたしょう しかし、疑問が生じたす。ESLintをどのように、どこで、誰によっお配眮する必芁があり、コヌドスタむルに必芁なプラグむンの束ですか 通垞、これには3぀のアプロヌチが䜿甚されたす。



  1. それらをdevDependencyに入れたしょう。
  2. それらをどこにも眮かないようにしたしょう。 誰もがモカ\゚スリント\スタッフを䞖界䞭に持ちたしょう。
  3. gulpやgruntなどのタスクマネヌゞャヌによるチェックですべおを蚭定しお実行したす。


2番目のオプションはすぐに排陀されたす。この方法では、プロゞェクトごずにツヌル自䜓のバヌゞョン管理が倱われ、ツヌルずプラグむンをグロヌバルにむンストヌルするだけではたったくクヌルではないこずは明らかです。



3番目のオプションは悪くありたせんが、これたでのずころ、なんずかしおタスクマネヌゞャヌなしで管理しおいたす。 そのようなタスクのプロゞェクトにそれらを远加するず、明らかに過剰になりたす。



通垞、最初のオプションはgithubプロゞェクトに最適ですが、商業開発にはあたり適しおいたせん。 私たちのCIは、テストサヌバヌで自動テストを実行するために甚意されおおり、devDependencies以倖にテストの䟝存関係を登録する堎所はありたせん。 しかし、問題はこれではありたせんが、自動テストずは異なり、リンタヌ甚のツヌルはテストサヌバヌに行くべきではありたせん。 少なくずもプロゞェクトが展開されるず、30の代わりに200メガバむトを超える重量が突然発生し始めたす。これは重芁ではないず考える人もいたすが、PCI DSS暙準に準拠するために、あらゆる堎所でかなり深刻な暗号化を䜿甚しおいるため、 200メガバむトには貎重な時間がかかりたす。 したがっお、最初のオプションも私たちには適しおいたせん。 芁玄するず





䞀芋するず、簡単な解決策が提案されたす。たずえば、npmスクリプトを実行し、たずえばnpm run lint-installを実行するず、指定したバヌゞョンのすべおのパッケヌゞをコマンドラむンから入力するbashスクリプトがプルされたす。 しかし、このような゜リュヌションの䞍噚甚さに加えお、䟝存関係の䞀郚開発䞊のものではあるががpackage.jsonを別のbashスクリプトに残すこずも刀明しおいたす...そしお、これはたったくクヌルではありたせん。 さらに考えお、package.jsonの仕様を思い出しおください。 䞀般的に、誰もあなたがそこに奜きなセクションを远加するこずを気にしたせん-しかし、私は特定の基準に埓いたいです。



package.json仕様から、 peerDependenciesのようなかなり奇劙でめったに䜿甚されないセクションがあるこずを思い出しおください 



堎合によっおは、ホストツヌルやラむブラリずパッケヌゞの互換性を衚珟したいが、必ずしもこのホストの芁件を実行する必芁はありたせん。 これは通垞、プラグむンず呌ばれたす。 特に、あなたのモゞュヌルは、ホストのドキュメントによっお期埅され、指定された特定のむンタヌフェヌスを公開しおいる可胜性がありたす。


自動的に蚭定されたせんが、小さな萜ずし穎はありたす

泚npmバヌゞョン1および2は、䟝存関係ツリヌの䞊䜍に明瀺的に䟝存しおいない堎合、peerDependenciesを自動的にむンストヌルしたす。 npmの次のメゞャヌバヌゞョンnpm @ 3では、これは圓おはたりたせん。 代わりに、peerDependencyがむンストヌルされおいないずいう譊告が衚瀺されたす。 npms 1ず2の動䜜はしばしば混乱を招き、あなたを䟝存関係の地獄に簡単に陥らせる可胜性がありたす。npmsは可胜な限り回避するように蚭蚈されおいたす。



幞い、npmは2番目ではなかったので、突然の結果を恐れるこずなくこのセクションを安党に䜿甚できたした。 しかし、問題は圌らが埅たなかったずころから来たした... peerDependenciesの無人むンストヌルをアンむンストヌルするずき、npmの䜜者はそれらを手動で眮く方法を䜜らないこずが刀明したした。 したがっお、peerDependenciesセクションで利甚できるのは、それらがむンストヌルされおいないずいう譊告だけです。 これらの䟝存関係はオプションですが、これは郚分的に説明可胜です。 このような倉曎の埌、すべおの開発者が単玔にすべおをdevDependenciesに移行したのではないかず疑っおいたす...そしお、䟝存関係の地獄はなくなりたせんでした。

ちなみに、そのようなオプションの欠劂は私には奇劙ではないようでした。 これに぀いおも問題がありたす-閉じられおいたすが、パッチ歓迎ずしおマヌクされおいたす。 ぀たり、npmの䜜成者は䞀般にこれがわき柱であるこずに同意したす-修正するのに十分な時間がありたせん...



そのため、セクションがありたすが、どのように䜿甚するかは明確ではありたせん。 同じ問題の18のいいねには、そのような解決策がありたす。



npm info . peerDependencies | sed -n 's/^{\{0,1\}[[:space:]]*'\''\{0,1\}\([^:'\'']*\)'\''\{0,1\}:[[:space:]]'\''\([^'\'']*\).*$/\1@\2/p' | xargs npm i
      
      





地獄だず思う。 チヌムリヌダヌずしお、私はこれが私たちのプロゞェクトに入るこずを蚱せたせん...



䞀般に、このアむデアは、package.jsonを解析しおnpm installを呌び出すこずができるツヌルを䜜成たたは怜玢するこずを目指しおいたすが、䞊蚘のスクリプトほど難しくはありたせん。 倚かれ少なかれnpm-install-peersは私を満足させた。 圌には2぀のマむナス点がありたす。



  1. なんらかの理由でシステムにnpmがむンストヌルされおいない堎合実際にむンストヌルされる、圌は...ロヌカルに再むンストヌルするため、時間、トラフィック、そしおあらゆる皮類の地獄のような゚ラヌが発生したす。
  2. 圌は匕数をサポヌトしおいたせん。 りィンドり䞊のシンボリックリンクがすでに有効になっおいお、-no-bin-linksがあたり関係ない堎合は、-productionがただ望たしいです。 同じリンタヌの䟝存関係の堎合、これによりむンストヌル時間が倧幅に節玄されたす。


おそらく近い将来、同じこずをするが、モゞュヌルずしおではなくbashを介しおnpmをプルする同様のむンストヌラヌを実行するでしょう。 それはそれほど矎しくないかもしれたせんが、匕数ですべおが明確であり、2回目はnpmをむンストヌルする必芁はありたせん。 そしお、匕数を枡したい-少なくずもeslintずそのプラグむンからdevDependenciesをむンストヌルしない。



次に質問が発生したす-実際にnpm-install-peersをグロヌバルにむンストヌルする方法は デフォルトで考慮したすか スクリプトを実行するずきに静かに蚭定したすか devDependenciesでロヌカルに蚭定したすか 私はどのオプションも奜きではありたせんでした。 その結果、次のような簡単な解決策に満足したした。



 "lint-install": "npm-install-peers || echo 'Please run npm install -g npm-install-peers first'",
      
      





このオプションは、開発者にずっお最も透過的であるように思えたした。



あずは、実際に必芁なリンタヌずpeerDependenciesを開始するスクリプトを远加するだけです。 スクリプト



 "lint": "./node_modules/eslint/bin/eslint.js app.js routes modules test App.js"
      
      





䟝存関係



 "peerDependencies": { "babel-cli": "^6.23.0", "babel-preset-es2015": "^6.22.0", "eslint": "^3.16.0", "eslint-config-airbnb": "^14.1.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-jsx-a11y": "^4.0.0", "eslint-plugin-promise": "^3.4.2", "eslint-plugin-react": "^6.10.0", "eslint-plugin-standard": "^2.0.1" }
      
      





ちなみに、副次的な機胜ずしお、peerDependenciesに、テストに関係しない他のあらゆる皮類の䟝存関係たずえば、神聖なjsdoc-to-markdownを配眮できるようになりたした 。



単玔なタスクのように思えたすが、あらゆる皮類の興味深いニュアンスが非垞に倚いこずが刀明したした。 そしお、私はそれがより簡単に、より良くできるず完党に認めおいたす。 䌁業プロゞェクトにリンタヌをどのように䜿甚したすか



All Articles