# 有条件地包含程序集

> Use scripting symbols to conditionally include or exclude assemblies from compilation.

可以使用预处理器符号控制是否对程序集进行编译并包含在应用程序的构建中（包括编辑器中的运行模式）。可以在程序集定义选项中通过 **Define Constraints** 列表指定必须为要使用的程序集定义的符号：

1. 选择程序集的程序集定义以在\_\_检视面板\_\_中查看其属性。

2. 在 **Define Constraints** 部分中，单击 **+** 按钮以将新符号添加到约束列表中。


   **Frame:**
   ![](/api/media?file=/engine/6000.0/media/images/asmdef-7.png)

3. 输入符号名称。

   可以通过在名称前放置感叹号来“否定”符号。例如，约束 `!UNITY_WEBGL` 会在未定义 `UNITY_WEBGL` 时包含程序集。

4. 单击\_\_应用 (Apply)\_\_。

可以使用以下符号作为约束：

* [Scripting Define Symbols](/engine/6000.0/manual/unity-editor/editor-features/comp-manager-group/class-player-settings.md) 设置中定义的符号，可以在\_\_项目设置\_\_的\_\_播放器\_\_部分中找到这些符号。请注意，**Scripting Define Symbols** 适用于当前在项目[构建设置](/engine/6000.0/manual/unity-editor/editor-features/build-settings/build-profiles.md)中设置的平台。要为多个平台定义一个符号，必须切换到每个平台并单独修改 **Scripting Define Symbols** 字段。
* Unity 定义的符号。请参阅 [Unity 脚本符号参考](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/conditional-compilation/symbol-reference.md)。
* 使用程序集定义资源的 [Version Defines](#define-symbols) 部分定义的符号。

在确定是否满足约束时，不会考虑脚本中定义的符号。

有关其他信息，请参阅 [Define Constraints](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files/class-assembly-definition-importer.md#define-constraints)。

## 根据 Unity 和项目包版本定义符号##defining-symbols-based-on-unity-and-project-package-versions

如果需要根据项目是使用 Unity 还是包的特定版本，在程序集中编译不同代码，则可以向 **Version Defines** 列表添加条目。此列表为何时定义符号指定规则。对于版本号，可以指定计算结果为特定版本或版本范围的逻辑表达式。

要有条件地定义符号，请执行以下操作：

1. 选择程序集的程序集定义资源以在\_\_检视面板\_\_中查看其属性。

2. 在 **Version Defines** 部分中，单击 **+** 按钮以将条目添加到列表中。

3. 设置属性：

   * **Resource**：选择必须按顺序安装才能定义此符号的 **Unity**、包或模块
   * **Define**：符号名称
   * **Expression**：计算结果为特定版本或版本范围的表达式。有关规则，请参阅\[版本定义表达式]。

   **Expression outcome** 显示表达式计算得出的版本。如果结果显示 **Invalid**，则表达式语法不正确。

   以下示例定义符号 `USE_TIMELINE_1_3`（如果项目使用时间轴 1.3），并定义 `USE_NEW_APIS`（如果项目在 Unity 2021.2.0a7 或更高版本中打开）：


   **Frame:**
   ![](/api/media?file=/engine/6000.0/media/images/asmdef-8.png)

4. 单击\_\_应用 (Apply)\_\_。

在程序集定义中定义的符号仅在为该定义创建的程序集中的脚本范围内。

请注意，可以使用通过 **Version Defines** 列表定义为 **Define Constraints** 的符号。因此，可以指定仅当项目中也安装了给定包的特定版本时才应使用程序集。

### 版本定义表达式##version-define-expressions

可以使用表达式指定确切版本或版本范围。**Version Define** 表达式使用数学范围表示法。

方括号“\[]”指定范围包括端点：

> `[1.3,3.4.1]` 计算为 `1.3.0 &lt;= x &lt;= 3.4.1`

圆括号“()”指定范围不包括端点：

> `(1.3.0,3.4)` 计算为 `1.3.0 &lt; x &lt; 3.4.0`

可以在单一表达式中混合两种范围类型：

> `[1.1,3.4)` 计算为 `1.1.0 &lt;= x &lt; 3.4.0`

> `(0.2.4,5.6.2-preview.2]` 计算为 `0.2.4 &lt; x &lt;= 5.6.2.-preview.2`

可以在方括号中使用单一版本指示符来指定确切版本：

> `[2.4.5]` 计算为 `x = 2.4.5`

作为快捷方式，可以输入不带范围括号的单一版本指示表达式包含该版本或更高版本：

> `2.1.0-preview.7` 计算为 `x >= 2.1.0-preview.7`

\_\_注意：\_\_表达式中不允许存在空格。不支持通配符。

### Unity 版本号##unity-versioning-scheme

Unity 的当前版本（以及支持程序集定义的所有版本）使用包含三部分的版本指示符：MAJOR.MINOR.REvision，例如 `2017.4.25f1`、`2018.4.29f1` 和 `2019.4.7f1`。

* MAJOR 版本为四位数字，对于 Unity `2022.x.z` 及更低版本表示发布年份，对于 Unity 6 (6000.x.z) 及更高版本表示主要技术版本。

* MINOR 版本是目标发布季度，例如 1、2、3 或 4。

* REVISION 指示符包含三个部分，其格式为：RRzNN，其中：

  * RR 是一位或两位修订版号

  * z 是表示发布类型的字母：

    * a = alpha 版本
    * b = beta 版本
    * f = 正式公开发布版本
    * c = 中国发行版本（等同于 f）
    * p = 补丁版本
    * x = 实验性版本

  * NN 是一位或两位递增数字

版本类型指示符比较如下：

> `a &lt; b &lt; f = c &lt; p &lt; x`

换句话说，alpha 版本被视为早于 beta 版本，而 beta 版本早于正式公开发布版本 (f) 或中国发行版本 (c)。补丁版本始终晚于具有相同修订版号的正式公开发布版本或中国发行版本，而实验性版本则晚于任何其他版本类型。请注意，实验性版本不会在末尾使用递增数字。

Unity 版本号允许在 REVISION 组件之后有后缀，例如 `2019.3.0f11-Sunflower`。为了比较版本，会忽略任何后缀。

例如，以下表达式包括 Unity 的任何 2017 或 2018 版本，但不包括 2019 或更高版本：

```
[2017,2019)
```

### 包和模块版本号##package-and-module-version-numbers

包和模块版本指示符有四个部分，遵循[语义版本控制](https://semver.org/)格式：MAJOR.MINOR.PATCH-LABEL。前三个部分全为数字，但标签是字符串。Unity 包预览版使用字符串、`preview` 或 `preview.n`，其中 `n > 0`。有关包版本号的更多信息，请参阅[包版本控制](/engine/6000.0/manual/upm-server.md)。

例如，以下表达式包含 MAJOR.MINOR 版本在 3.2 到 6.1（含边界版本）之间的包的所有版本：

```
[3.2,6.1]
```

## 其他资源##additional-resources

* [创建程序集定义](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files/assembly-definitions-creating.md)
* [引用程序集](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files/assembly-definitions-referencing.md)
* [程序集元数据](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files/metadata.md)
* [程序集定义 (Assembly Definition) 属性](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files/class-assembly-definition-importer.md)
* [程序集定义引用属性](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files/class-assembly-definition-reference-importer.md)
* [程序集定义文件格式](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-compilation/assembly-definition-files/file-format.md)
