Rustでラむブラリを䜜成するためのヒント

Pascal Hertleifの蚘事「Rustラむブラリを䜜成するためのグッドプラクティス」 2015.10.24。



箄1幎埌、Mozilla Researchのプログラミング蚀語であるRustに興味を持ち、セキュリティ、速床、䞊行性の3぀のタスクに焊点を圓おたした。 CやC ++ず同皋床の䜎レベルで、優れた型システムゞェネリックず特性を備えた、䜿いやすいコンパむラヌ、優れたCargoパッケヌゞマネヌゞャヌを備えおいたす。


Rust 1.0のリリヌス 2015幎5月から6か月が経過したした 。私の䞀郚を含む倚くのラむブラリパッケヌゞ、クレヌトがcrates.ioの䞭倮レゞスタに公開されたした。 他の人があなたのラむブラリを芋぀け、䜿甚し、補完するのに圹立぀いく぀かの優れたプラクティスを玹介したす「ベスト」ず呌ぶには早すぎたす。



コヌドをきれいに保぀


もちろん、最も重芁なこずはコヌド自䜓です。 Rustはデフォルトで倚くのこずをチェックしたすが、コヌドを改善するためにできるこずは他にもありたす。


この蚘事では、コヌドを蚘述するための具䜓的なヒントに぀いおは説明したせん。 ただし、ラむブラリのロゞックやアヌキテクチャパタヌンの構造化に関するヒントに興味がある堎合は、い぀でも公匏の本  翻蚳 ずRust Design Patternsを参照できたす。



rustfmt


rustfmtは自動的にコヌドを再フォヌマットし、特に著者以倖の人車はカりントしたせん-コンパむルするずコヌドを理解したすに理解しやすくしたす翻蚳者の泚意スタむルに関する無駄な匕数も停止したす。 そしお、圌はこれに぀いおはかなり良い仕事をしおいる。たあ、少なくずも圌は私のコヌドで䜕も台無しにしおいない。 このコマンドを時々実行するだけです翻蚳者のメモたたは.rs拡匵子でファむルを保存するずきに自動rustfmtを゚ディタヌに远加しおください。これにより、コヌドは残りのRustコヌドのようになりたす。


 $ rustfmt src/lib.rs 

One True Rustスタむルを定矩する詊みが行われおいるにもかかわらず、rustfmtはデフォルトでそれに埓うこずを詊みたすが、 ここでフォヌマットオプションのリストを芋぀けるこずができたす。 珟時点では、私のプロゞェクトのほずんどは次の蚭定を䜿甚しおいたすこれをプロゞェクトのルヌトにあるrustfmt.tomlファむルに保存したす


 format_strings = false reorder_imports = true 

翻蚳者のメモずころで、 cargo install rustfmtを介しおcargo install rustfmt 、 cargo fmtサブコマンドが利甚可胜になりたした。しかし個人的には、rusfmt圢匏は腹立たしく、オプションを最埌たで修正するのに圹立たなかったため、実装を延期したした。



より倚くのチェックを䜿甚したす。


チェックリントは、ビルド時にコヌドをチェックする小さなコンパむラプラグむンです䞻にスタむル゚ラヌに぀いお。 デフォルトでは、rustcにはすでにdead-code  デッドコヌドの譊告やnon-snake-case 䞀郚の芁玠の名前がsnake_caseにないnon-snake-case譊告などの譊告がすでに含たれおいたす。


他にも非垞に䟿利な組み蟌みチェックがいく぀かありたす。 #![warn(...)]を#![deny(...)]眮き換えるこずにより、それらを本栌的なアセンブリ゚ラヌに倉えるこずもできたす マニュアルを参照。 通垞、これらをプロゞェクトに远加したす。


 #![deny(missing_docs, missing_debug_implementations, missing_copy_implementations, trivial_casts, trivial_numeric_casts, unsafe_code, unstable_features, unused_import_braces, unused_qualifications)] 

最初のmissing_docsは特に䟿利です。コヌドに文曞化されおいないパブリックむンタヌフェむスがある堎合に起動したす。 unsafe_codeも非垞に䟿利です。そのおかげで、ラむブラリは人々の目にはより信頌できるように芋えたす。


䜿甚可胜なすべおのチェックずその説明のリストは、 rustc -W helpコマンドの出力にありたす。



神のチェックぞのさらなるチェック


リントが良いこずにすでに気付いおいるず思いたす。 したがっお、 clippyの䜜者はさらに100を曞きたした実際、バヌゞョン0.0.21に぀いおは玄68です翻蚳者のメモ すでにもっず 。 clippyは今のずころコンパむラプラグむンであるため、それを操䜜するにはrutscの倜間アセンブリが必芁になりたす。これはさたざたな方法で呌び出すこずができたす。たずえば、 cargo-clippyを䜿甚するか、プロゞェクトのオプションの䟝存関係ずしお远加したす。


私は最埌のオプションを奜むので、これを私のCargo.tomlに远加したした


 [dependencies] clippy = {version = "0.0.21", optional = true} [features] default = [] dev = ["clippy"] 

これらの蚭定により、clippyはオプションの䟝存関係ずなり、 devフラグが蚭定されおいる堎合にのみ有効になりたす。 メむンパッケヌゞファむルには、オプションで次のように含めるこずができたす。


 #![cfg_attr(feature = "dev", allow(unstable_features))] #![cfg_attr(feature = "dev", feature(plugin))] #![cfg_attr(feature = "dev", plugin(clippy))] 

cargo build --features "dev"しおプロゞェクトをcargo build --features "dev"ず、自動的にクリップチェックがトリガヌされたす。 もちろん、以前に犁止しおいた堎合にのみ、 unstable_featuresを蚱可する必芁がありたす。


譊告珟圚、コンパむラプラグむンは䞍安定です。 新しいコンパむラナむトアセンブリをアップグレヌドするず、clippyが砎損する可胜性がありたす。 クリップの䜜成者は通垞、すべおをすばやく修正したす。


翻蚳者のメモ clippyのオンラむンバヌゞョンは比范的最近登堎したしたが、今では倜のrustcのロヌカルむンストヌルに煩わされず、Readme.mdにもう1぀バッゞを付ける理由がありたす


組み蟌みのチェックず同様に、clippyの䞀郚のチェックはデフォルトでオフになっおいたす。 完党なリストを芋぀けるためにクリップドキュメンテヌションを芋お、あなたのために面癜いものを含めおください



テスト


Rustには玠晎らしいテストサポヌトが組み蟌たれおいたす。モゞュヌルのテストをモゞュヌル内ですばやく蚘述できたす。たた、cargoが自動的に実行したす tests/ディレクトリ内の*.rsファむル。 ああ、 ドキュメント内のexamples/ たたはexamples/ もテストされたす。


ここで蚀うこずはこれ以䞊ありたせん。 公匏の本の章を読んでください 翻蚳 。



プロゞェクトのむンフラ


コヌド自䜓に加えお、プロゞェクトを公開するずきに考慮する必芁がある他のポむントがありたす。 これらは䞻にGitHubでコヌドを公開する人に圹立ちたすが、これらのヒントの䞀郚はそれなしで適甚されたす。



貚物メタデヌタ


䟿利なラむブラリの怜玢を容易にするための最初のそしお最も簡単なこずは、 Cargo.tomlファむルにCargo.tomlです。 crates.ioには倚くのメタデヌタフィヌルドがありたす。 HSLパッケヌゞの䟋を次に瀺したす。


 [package] name = "hsl" version = "0.1.0" authors = ["Pascal Hertleif <my@email.address>"] repository = "https://github.com/killercup/hsl-rs.git" homepage = "https://github.com/killercup/hsl-rs.git" license = "MIT" readme = "README.md" documentation = "http://killercup.imtqy.com/hsl-rs/" description = "Represent colors in HSL and convert between HSL and RGB." 

ずころで、䟝存関係に'*'バヌゞョンを䜿甚しないでください-crates.ioは 、Cargoが䟝存するセマンティックバヌゞョニングを無芖するため、そのようなパッケヌゞを拒吊したす。 たた、䟝存するパッケヌゞの最新バヌゞョンの远加を簡玠化するために、 cargo-editを䜿甚できたす 。



README.md


リポゞトリの開始ペヌゞを芋おいる人は、 Readme.mdファむルの内容を芋る可胜性が高くなりたす。 暙準的な質問に察する回答があるこずを確認しおください。



翻蚳者泚ずころで、ラむセンスに぀いお1月に、Rustコミュニティは重芁なプロゞェクトのほずんどをデュアルMIT / Apache-2.0ラむセンスに移行し、デフォルトで将来䜿甚するこずを勧めおいたす。匕数は、たずえばcgmathラむブラリタスクにありたす 。


たた、 Readme.md 、ラむブラリの小さな䜿甚䟋を投皿するのに最適な堎所です。倚くの堎合、人々がラむブラリを理解し始めるのに䟿利です。 Readme.md およびMarkdown圢匏の他のドキュメントの䟋が動䜜するこずを確認するには、 skepticを䜿甚できたす。 Cargoアセンブリプロセス build.rsファむルに小さなフックを远加するこずで、懐疑的な人を呌び出しお、Markdownファむルのコヌドサンプルを通垞のテストに倉換できたす。 詳现に぀いおは、懐疑的なドキュメントを参照しおください。



その他のメタファむル


.gitignoreファむルを远加するこずを忘れないでください。ここでは、gitがtarget/ディレクトリを远跡するこずは犁止されおいたす .gitignore泚意Cargoは䞀時ファむルずアセンブリアヌティファクトにこのディレクトリを䜿甚するため、 ハヌド通貚で修正する意味はありたせん。 ラむブラリパッケヌゞ぀たり、実行可胜ファむルを生成しないの堎合、 Cargo.lockファむルも無芖するCargo.lockたす翻蚳者のメモ why 。


すべおのプロゞェクトに远加しようずしおいる別のファむルは.editorconfigです。 次の蚭定を䜿甚したす。


 root = true [*] end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true indent_style = space indent_size = 4 [*.md] trim_trailing_whitespace = false 


継続的むンテグレヌション


オヌプン゜ヌスプロゞェクトがGitHubでホストされおいる堎合、 Travis CIの継続的統合サヌビスを無料で䜿甚できたす。 提出された倉曎コミットたたは远加芁求ごずに、さたざたな環境たずえば、Rustの安定版、ベヌタ版、倜間バヌゞョン、たたは異なるアヌキテクチャでテストの自動起動を構成できるため、䟿利です。


travis-cargoを䜿甚するず、Travisでテストずベンチマヌクを実行し、ドキュメントを生成およびGitHub Pagesにプッシュ、テストカバレッゞを読み取りおよびCoverallsに送信できたす。


この.travis.ymlテンプレヌトのようなものを䜿甚したす。


 sudo: false language: rust rust: - nightly - beta - stable matrix: allow_failures: - rust: nightly before_script: - | pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH script: - | travis-cargo build && travis-cargo test && travis-cargo bench && travis-cargo --only stable doc addons: apt: packages: - libcurl4-openssl-dev - libelf-dev - libdw-dev after_success: - travis-cargo --only stable doc-upload - travis-cargo coveralls --no-sudo notifications: email: on_success: never env: global: - TRAVIS_CARGO_NIGHTLY_FEATURE=dev - secure: #    

翻蚳者のメモオリゞナルでは、これは「基本蚭定」ず呌ばれたすが、「基本」は単にsudo: false\nlanguage: rustであるため、ここでは同意したせん


この構成には、特にclippyを起動するためのいく぀かのオプションがありたす。倜間コンパむラによるビルド結果は重芁ではありたせんプラグむンむンタヌフェむスは倉曎でき、すべおが壊れたす。倜間コンパむラはdevフラグで呌び出されたす。


TravisはLinuxおよびMac OS Xでビルドできたす。Windowsでのテストに぀いおは、 AppVeyorをご芧ください オヌプン゜ヌスプロゞェクトでも無料です。 翻蚳者のメモ非垞に䟿利ですが、Travisサヌビスに比べお非垞に遅いです。



ドキュメントの自動生成


travis-cargoでサポヌトされおいる生成されたドキュメントの自動読み蟌み぀たり、rust-doc出力をgh-pagesブランチに送信プッシュするを有効にするには、アカりントのアクセストヌクンを含むGH_TOKEN環境倉数を远加する必芁がありたすGitHub制限付き暩利。 ここで䜜成できたす各プロゞェクトに1぀ありたす。 マヌカヌを暗号化するには、プロゞェクトのルヌトディレクトリで実行しおTravisCLIナヌティリティ gem install travis travisず共にgem install travis を䜿甚できたす 1234をマヌカヌに眮き換えたす。


 $ travis encrypt "GH_TOKEN=1234" --add env.global 

すべおが正しく構成されたら、 .imtqy.com/プロゞェクト文曞䟋 killercup.imtqy.com/hsl-rsが衚瀺されたす。


翻蚳者のメモhtmlでレンダリングされたドキュメントをプロゞェクトブランチにプッシュするこずは非垞に䞀般的な慣行ですが、アむデアのように思えたす。理想的には、crates.ioはrustdocをプルし、その出力を保存/衚瀺する godoc.orgの粟神で  。crates.fyiの圢で良い束葉杖がありたすが 。



ほむ


継続的むンテグレヌションを䜿甚するず、プルリク゚ストのコヌドが機胜し、マヌゞの準備ができおいるこずを確認できたす。 githubの最新の倉曎- 必須チェックステヌタスチェック  translation で保護されたブランチにより 、マヌゞの前にすべおのテストに合栌したこずを確認できたす。 しかし、ブランチずマスタヌの泚入埌にテストが合栌するかどうかはわかりたせん


GitHubのRustプロゞェクトは、 Bors統合ロボットを䜿甚しおこの問題を解決したす。包含リク゚スト自䜓をマヌゞする代わりに、Borsにこれを行うように指瀺したす。 Borsは、1぀の芁求を含めキュヌがありたす、それを珟圚のマスタヌにマヌゞし、すべおのテストを実行し、成功した堎合、マスタヌブランチに新しいバヌゞョンを送信したす。 これは、倚数のむンクルヌド芁求の圱響に時間がかかる可胜性があるこずを意味したすが、すべおのテストが垞にりィザヌドで実行されるので安心できたす。


Borsaコアはhomuず呌ばれ、プロゞェクトで䜿甚できたす。 githubでhomuをコラボレヌタヌずしお远加し、 homu.ioでプロゞェクトを登録し、コメント@homu r+を䜿甚しお包含リク゚ストをマヌゞしたす。



その他のトリック


もっず知りたいですか OK、ここにいく぀かのヒントがありたす



翻蚳者のメモ私はClogの䜿甚に぀いおは本圓に同意したせん。 ここで 、私にずっお、優れた倉曎ログは、これは自動的に機胜したせん。しかし、おそらく、自動倉曎ログはたったくないよりはたしです。



おわりに


最埌たで読んでくれおありがずう 次のラむブラリRustでここで説明されおいる手法のいく぀かを䜿甚しおください。

Source: https://habr.com/ru/post/J280482/


All Articles