Version: 2020.3
유닛 테스트
스크립팅 개념

Roslyn 분석기와 규칙 집합 파일

Unity 프로젝트의 Roslyn 분석기와 규칙 집합 파일을 사용하여 코드의 스타일, 품질, 기타 문제를 검사할 수 있습니다.

You can use existing analyzer libraries to inspect your code, and write your own analyzers to promote the best practices or conventions within your organization. This page explains how to use Roslyn analyzers in an empty Unity Project.

기존 Roslyn 분석기 라이브러리 사용

To use an existing Roslyn analyzer library, install the ErrorProne.NET.CoreAnalyzers library from NuGet inside your project. Then open the .csproj file. The project has three .dll files included as analyzers:

  <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>

Move the three .dll files into the Assets folder (or any folder nested in the Assets folder) in your Unity project. In the Editor, select the .dll file. In the Plugin Inspector, under Select platforms for plugin, disable Any Platform. Under Include platforms, disable Editor and Standalone platforms. Then, give all the DLLs a new Asset Label called RoslynAnalyzer.

To test that everything works, save a file named RethrowError.cs with the following code in your project’s Assets folder. This code causes ErrorProne.NET to raise warnings about incorrect exception propagation and suspicious exception handling:

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();
    }
}

이렇게 하면 콘솔 창에 다음의 두 가지 경고가 표시됩니다.

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.

분석기 범위

Analyzers apply globally to any assembly in your project if they’re in the Assets folder, or in a subfolder that doesn’t contain an assembly definition file in any of their parent folders. If an analyzer is in a folder that contains an assembly definition, or a subfolder of such a folder, the analyzer only applies to the assembly generated from that assembly definition, and to any other assembly that references it.

패키지는 패키지를 사용하는 코드에만 적용되는 분석기를 제공할 수 있습니다. 이는 패키지 사용자가 패키지 API를 올바르게 사용하도록 안내하는 등의 경우에 도움이 됩니다.

규칙 집합 파일

프로젝트의 분석기에서 발생하는 다양한 경고 및 오류를 처리하는 방법에 대한 고유한 규칙을 정의하기 위해 규칙 집합 파일을 만들 수 있습니다. 커스텀 규칙 집합을 만드는 방법에 대한 자세한 내용은 커스텀 규칙 집합을 만드는 방법에 대한 Microsoft의 Visual Studio 문서를 참조하십시오.

In the Assets root folder, place a ruleset file named Default.ruleset. The rules you define in Default.ruleset apply to all predefined assemblies (for example Assembly-CSharp.dll), and all assemblies that are built using .asmdef files.

To override the rules in Default.ruleset for a predefined assembly, create a .ruleset file in the root folder with the name [PredefinedAssemblyName].ruleset. For example, the rules in Assembly-CSharp.ruleset apply to the code in Assembly-CSharp.dll. Only these .ruleset files are allowed inside the root folder:

  • 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가 새 규칙 집합 파일을 사용하여 어셈블리를 다시 컴파일합니다. 재컴파일 후 콘솔 창에는 다음과 같은 두 개의 메시지가 표시됩니다.

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 저장소에 대한 링크입니다.

유닛 테스트
스크립팅 개념
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961