Version: 2020.3
言語: 日本語
ユニットテスト
スクリプティングの概念

Roslyn アナライザーとルールセットファイル

Unity プロジェクトで Roslyn アナライザーとルールセットファイルを使用して、コードのスタイルや品質、その他の問題を検査します。

既存のアナライザーライブラリを使用してコードを検査したり、独自のアナライザーを作成して組織内のベストプラクティスや規約を推進したりすることができます。このページでは、空の Unity プロジェクトで Roslyn アナライザーを使用する方法を説明します。

既存の Roslyn アナライザーライブラリを使用

既存の Roslyn アナライザーライブラリを使用するには、ErrorProne.NET.CoreAnalyzers library from NuGet をプロジェクト内部にインストールします。次に、 .csproj ファイルを開きます。このプロジェクトには、アナライザーとして 3 つの .dll ファイルが含まれています。

  <ItemGroup>
      <Analyzer Include="packages\ErrorProne.NET.CoreAnalyzers.0.1.2\analyzers\dotnet\cs\ErrorProne.NET.Core.dll" />
      <Analyzer Include="packages\ErrorProne.NET.CoreAnalyzers.0.1.2\analyzers\dotnet\cs\ErrorProne.Net.CoreAnalyzers.dll" />
      <Analyzer Include="packages\ErrorProne.NET.CoreAnalyzers.0.1.2\analyzers\dotnet\cs\RuntimeContracts.dll" />
    </ItemGroup>

3 つの .dll ファイルを、Unity プロジェクトの Assets フォルダー (または Assets フォルダー内にネストになっている任意のフォルダー) に移動します。エディターで .dll ファイルを選択します。Plugin InspectorSelect platforms for plugin で、 Any Platform を無効にします。Include platforms のセクションで、 EditorStandalone のプラットフォームを無効にします。次に、すべての DLL に新しい アセットラベル として RoslynAnalyzer を与えます。

すべてが動作することをテストするために、RethrowError.cs というファイルに以下のコードを記述して、プロジェクトの Assets フォルダーに保存します。このコードによって、ErrorProne.NET は、不正な例外の伝播や疑わしい例外処理に関する警告を発します。

using System;
using UnityEngine;

public class RethrowError : MonoBehaviour
{
    void Update()
    {
        try
        {
            DoSomethingInteresting();
        }
        catch (Exception e)
        {
            Debug.Log(e.Message);
            throw e;
        }
    }

    private void DoSomethingInteresting()
    {
        throw new System.NotImplementedException();
    }
}

これを実行すると、コンソールウィンドウに以下の 2 つの警告が表示されます。

Assets\RethrowError.cs(14,23): warning EPC12: Suspicious exception handling: only e.Message is observed in exception block.
Assets\RethrowError.cs(15,19): warning ERP021: Incorrect exception propagation. Use throw; instead.

アナライザーのスコープ

アナライザーは、アセンブリが Assets フォルダー、またはその親フォルダーに アセンブリ定義ファイル が含まれていないサブフォルダーにある場合、プロジェクトのすべてのアセンブリにグローバルに適用されます。アナライザーがアセンブリ定義を含むフォルダー、またはそのサブフォルダーにある場合、アナライザーはそのアセンブリ定義から生成されたアセンブリと、それ以外のアセンブリ定義を参照するアセンブリにのみ適用されます。

つまり、パッケージ は、パッケージを使用するコードにのみ適用されるアナライザーを供給できます。例えば、パッケージのユーザーがパッケージの API を正しく使用するためのサポートとして使用されます。

ルールセットファイル

プロジェクトのアナライザーが発するさまざまな警告やエラーを処理する方法を独自のルールで定義するには、ルールセットファイルを作成します。カスタムルールセットの作成方法の詳細については、Microsoft の Visual Studio のドキュメント ルール セットをカスタマイズする を参照してください。

Assets ルートフォルダーに、Default.ruleset という名前のルールセットファイルを置きます。Default.ruleset で定義するルールは、すべての定義済みアセンブリ (例えば、Assembly-CSharp.dll)、および .asmdef ファイルを使用して構築されたすべてのアセンブリに適用されます。

Default.ruleset のルールを定義済みのアセンブリにオーバーライドするには、ルートフォルダーに .ruleset ファイルを作成し [PredefinedAssemblyName].ruleset と名づけます。例えば、Assembly-CSharp.ruleset のルールは、Assembly-CSharp.dll のコードに適用されます。これらの .ruleset ファイルのみがルートフォルダー内で許可されます。

  • Default.Ruleset
  • Assembly-CSharp.ruleset
  • Assembly-CSharp-firstpass.ruleset
  • Assembly-CSharp-Editor.ruleset
  • Assembly-CSharp-Editor-firstpass.ruleset

ワークフロー: Unity でルールセットファイルをテストする

Unity でルールセットファイルをテストするには、以下を行います。

ステップ 1: ルールセットファイルの設定

  1. プロジェクトの Assets フォルダーの中に Subfolder という名前のサブフォルダーを作成します。
  2. Subfolder 内で以下を行います。
    1. 新規に .asmdef ファイルを作成します。
    2. RethrowError.cs の複製を保存します。
  3. 以下のコードを使って、Assets の中に Default.ruleset ファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
  <Rules AnalyzerId="ErrorProne.NET.CodeAnalyzers" RuleNamespace="ErrorProne.NET.CodeAnalyzers">
    <Rule Id="ERP021" Action="Error" />
  <Rule Id="EPC12" Action="None" />
  </Rules>
</RuleSet>

Default.ruleset ファイルでは、以下のルールが定義されています。

  • EPC12 の抑制。疑わしい例外処理についての警告です。
  • ERP021 の発生。不正な例外伝播に関する警告です。

ステップ 2: プロジェクトの再ロード

プロジェクトにルールセットファイルを追加した後、ルールを適用するアセンブリ内にあるスクリプトをすべて再インポートします。これを行うと、Unity は新しいルールセットファイルを使用してアセンブリを再コンパイルします。再コンパイルの後、コンソールウィンドウに以下の 2 つのメッセージが表示されます。

Assets\Subfolder\RethrowError.cs(15,19): error ERP021: Incorrect exception propagation. Use throw; instead.
Assets\RethrowError.cs(15,19): error ERP021: Incorrect exception propagation. Use throw; instead.

Unity は Default.ruleset で定義されたルールを Assets/RethrowError.csAssets/Subfolder/RethrowError.cs の両方に適用していることに注目してください。

ステップ 3: カスタムルールセットの追加

Assets/Subfolder.ruleset ファイルを作成し、任意の名前を付けます (この例では Hello.ruleset)。

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
  <Rules AnalyzerId="ErrorProne.NET.CodeAnalyzers" RuleNamespace="ErrorProne.NET.CodeAnalyzers">
    <Rule Id="ERP021" Action="Info" />
    <Rule Id="EPC12" Action="Info" />
  </Rules>
</RuleSet>

この新しい Hello.ruleset ファイルは、Unity に EPC12ERP021 の両方を警告やエラーとして扱わずに、コンソールに出力するように指示します。

Unity がプロジェクトを再度コンパイルすると、コンソールウィンドウに以下のメッセージが表示されます。

Assets\Subfolder\RethrowError.cs(14,23): info EPC12: Suspicious exception handling: only e.Message is observed in exception block.
Assets\Subfolder\RethrowError.cs(15,19): info ERP021: Incorrect exception propagation. Use throw; instead.
Assets\RethrowError.cs(15,19): error ERP021: Incorrect exception propagation. Use throw; instead.

Default.ruleset のルールは Assets\RethrowError.cs にはまだ適用されますが、Assets\Subfolder\RethrowError.cs には適用されません。Hello.ruleset のルールがそれをオーバーライドするためです。

許可されているすべてのルールセットのアクションファイルの詳細については、Visual Studio のドキュメント コード分析ルールセットエディターを使用する を参照してください。

その他のアナライザー

以下は、よく使われる Roslyn アナライザーライブラリの Github リポジトリへのリンクです。

ユニットテスト
スクリプティングの概念