Azure devops 使用Linux构建时,Azure Devops无法在nuget包中找到文件

Azure devops 使用Linux构建时,Azure Devops无法在nuget包中找到文件,azure-devops,nuget,code-analysis,Azure Devops,Nuget,Code Analysis,我们公司使用一个nuget包来分发Stylecop规则集。此nuget软件包有一个道具文件,我已将其修改为如下所示: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <LinuxWarningFile>~/.nuget/packages/ourcompany.rulesets/0.0.0.0/conten

我们公司使用一个nuget包来分发Stylecop规则集。此nuget软件包有一个道具文件,我已将其修改为如下所示:

<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\0.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\0.0.0.0\content\OurCompanyRulesAsError.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>

</Project>

~/.nuget/packages/ourcompany.ruleset/0.0.0/content/OurCompanyRulesAsWarning.ruleset
真的
假的
真的
假的
~/.nuget/packages/ourcompany.ruleset/0.0.0/content/OurCompanyRulesAsWarning.ruleset
$(UserProfile)\.nuget\packages\ourcompany.ruleset\0.0.0\content\OurCompanyRulesAsWarning.ruleset
~/.nuget/packages/ourcompany.ruleset/0.0.0/content/OurCompanyRulesAsError.ruleset
$(UserProfile)\.nuget\packages\ourcompany.rulesets\0.0.0\content\OurCompanyRulesAsError.ruleset
(显然,在创建包的过程中,版本控制得到了纠正,这一切都很正常)

在Azure Devops上:

  • 当池设置为Windows Build时,它会找到正确的规则集
  • 当池设置为Linux Build时,它找不到规则集
错误:警告MSB3884:找不到规则集文件“.nuget\packages\ourcompany.rulesets\1.0.20230.1\content\OurCompanyRulesAsError.ruleset”

考虑到它漏掉了~,我认为它没有在第一个逻辑块中给出的路径上找到文件,已经将IsLinux计算为false,将IsWindows计算为true,并且正在使用包含linux构建中不存在的UserProfile的路径

通过检查此文档(),我认为nuget包的默认路径是:

默认全局包文件夹的位置。默认值为%userprofile%\.nuget\packages(Windows)或~/.nuget/packages(Mac/Linux)。


如何修复props文件,使其能够找到Linux构建的规则集?您是否考虑过使用MSBuildThisFileDirectory属性来避免查找路径?如果.props文件和.ruleset文件位于同一个包中,则可以使用MSBuildThisFileDirectory和相对路径

假设.props文件也位于包的子目录中(.ruleset看起来位于内容子目录中):


$(MSBuildThisFileDirectory)/../content/OurCompanyRulesAsWarning.ruleset
$(MSBuildThisFileDirectory)/../content/OurCompanyRulesAsError.ruleset
```

这绝对有效。MSBuildThisFileDirectory允许我形成规则集的相对路径!非常感谢。
<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>```