使用 Linux Build 构建时,Azure Devops 无法在 nuget 包中找到文件
Azure Devops cannot locate file in nuget package when building using Linux Build
我们公司使用 nuget 包来分发 Stylecop 规则集。这个 nuget 包有一个 props 文件,我已将其修改为如下所示:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<LinuxWarningFile>~/.nuget/packages/ourcompany.rulesets/0.0.0.0/content/OurCompanyRulesAsWarning.ruleset</LinuxWarningFile>
<IsLinux Condition = "Exists($(LinuxWarningFile))">true</IsLinux>
<IsLinux Condition = "$(IsLinux) == ''">false</IsLinux>
<IsWindows Condition = "$(IsLinux) == false">true</IsWindows>
<IsWindows Condition = "$(IsLinux) == true">false</IsWindows>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' And '$(IsLinux)'">
<CodeAnalysisRuleSet>~/.nuget/packages/ourcompany.rulesets/0.0.0.0/content/OurCompanyRulesAsWarning.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' And '$(IsWindows)'">
<CodeAnalysisRuleSet>$(UserProfile)\.nuget\packages\ourcompany.rulesets[=11=].0.0.0\content\OurCompanyRulesAsWarning.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' And '$(IsLinux)'">
<CodeAnalysisRuleSet>~/.nuget/packages/ourcompany.rulesets/0.0.0.0/content/OurCompanyRulesAsError.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' And '$(IsWindows)'">
<CodeAnalysisRuleSet>$(UserProfile)\.nuget\packages\ourcompany.rulesets[=11=].0.0.0\content\OurCompanyRulesAsError.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
</Project>
(很明显,在包创建过程中,版本控制得到了更正,一切正常)。
在 Azure Devops 上:
- 当 Pool 设置为 Windows Build 时,它会找到正确的规则集。
- 当 Pool 设置为 Linux Build 时找不到规则集。
错误:警告 MSB3884:找不到规则集文件“.nuget\packages\ourcompany.rulesets.0.20230.1\content\OurCompanyRulesAsError.ruleset”.
鉴于它省略了 ~,我认为它没有在第一个逻辑块中给定的路径找到文件,已将 IsLinux 评估为 false 并且 IsWindows为 true 并且正在使用包含 linux 构建中不存在的 UserProfile 的路径。
通过查看此文档 (https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file),我认为 nuget 包的默认路径是:
The location of the default global packages folder. The default is %userprofile%\.nuget\packages (Windows) or ~/.nuget/packages (Mac/Linux).
如何修复 props 文件,以便它可以找到 Linux 构建的规则集?
您是否考虑过使用 MSBuildThisFileDirectory 属性 来避免必须查找路径?如果 .props 文件和 .ruleset 文件在同一个包中,您可以使用 MSBuildThisFileDirectory 和相对路径。
假设 .props 文件也在包的 sub-directory 中(.ruleset 看起来在内容子目录中):
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)/../content/OurCompanyRulesAsWarning.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)/../content/OurCompanyRulesAsError.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
</Project>```
我们公司使用 nuget 包来分发 Stylecop 规则集。这个 nuget 包有一个 props 文件,我已将其修改为如下所示:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<LinuxWarningFile>~/.nuget/packages/ourcompany.rulesets/0.0.0.0/content/OurCompanyRulesAsWarning.ruleset</LinuxWarningFile>
<IsLinux Condition = "Exists($(LinuxWarningFile))">true</IsLinux>
<IsLinux Condition = "$(IsLinux) == ''">false</IsLinux>
<IsWindows Condition = "$(IsLinux) == false">true</IsWindows>
<IsWindows Condition = "$(IsLinux) == true">false</IsWindows>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' And '$(IsLinux)'">
<CodeAnalysisRuleSet>~/.nuget/packages/ourcompany.rulesets/0.0.0.0/content/OurCompanyRulesAsWarning.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' And '$(IsWindows)'">
<CodeAnalysisRuleSet>$(UserProfile)\.nuget\packages\ourcompany.rulesets[=11=].0.0.0\content\OurCompanyRulesAsWarning.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' And '$(IsLinux)'">
<CodeAnalysisRuleSet>~/.nuget/packages/ourcompany.rulesets/0.0.0.0/content/OurCompanyRulesAsError.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' And '$(IsWindows)'">
<CodeAnalysisRuleSet>$(UserProfile)\.nuget\packages\ourcompany.rulesets[=11=].0.0.0\content\OurCompanyRulesAsError.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
</Project>
(很明显,在包创建过程中,版本控制得到了更正,一切正常)。
在 Azure Devops 上:
- 当 Pool 设置为 Windows Build 时,它会找到正确的规则集。
- 当 Pool 设置为 Linux Build 时找不到规则集。
错误:警告 MSB3884:找不到规则集文件“.nuget\packages\ourcompany.rulesets.0.20230.1\content\OurCompanyRulesAsError.ruleset”.
鉴于它省略了 ~,我认为它没有在第一个逻辑块中给定的路径找到文件,已将 IsLinux 评估为 false 并且 IsWindows为 true 并且正在使用包含 linux 构建中不存在的 UserProfile 的路径。
通过查看此文档 (https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file),我认为 nuget 包的默认路径是:
The location of the default global packages folder. The default is %userprofile%\.nuget\packages (Windows) or ~/.nuget/packages (Mac/Linux).
如何修复 props 文件,以便它可以找到 Linux 构建的规则集?
您是否考虑过使用 MSBuildThisFileDirectory 属性 来避免必须查找路径?如果 .props 文件和 .ruleset 文件在同一个包中,您可以使用 MSBuildThisFileDirectory 和相对路径。
假设 .props 文件也在包的 sub-directory 中(.ruleset 看起来在内容子目录中):
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)/../content/OurCompanyRulesAsWarning.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)/../content/OurCompanyRulesAsError.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
</Project>```