簡體   English   中英

Dotnet 構建條件包參考

[英]Dotnet Build Conditional PackageReference

我需要在構建后運行 ILRepack MSBuild 任務,並在我們的項目文件中添加了以下目標:

  <Target Name="MergeNet45" AfterTargets="Build" Condition="'$(TargetFramework)' == 'net45' and '$(RunILRepack)' == 'true'">
    <Exec WorkingDirectory="$(OutputDir)" Command="$(ILRepack) /internalize /out:$(OutputDir)\$(AssemblyName).dll $(OutputDir)\$(AssemblyName).dll $(OutputDir)\System.IdentityModel.Tokens.Jwt.dll  $(OutputDir)\Microsoft.IdentityModel.JsonWebTokens.dll $(OutputDir)\Microsoft.IdentityModel.Tokens.dll $(OutputDir)\Microsoft.IdentityModel.Logging.dll $(OutputDir)\Newtonsoft.Json.dll" />
  </Target>

  <Target Name="MergeStandard" AfterTargets="Build" Condition="'$(TargetFramework)' == 'netstandard2.0' and '$(RunILRepack)' == 'true'">
    <Exec WorkingDirectory="$(OutputDir)" Command="$(ILRepack) /internalize /lib:$(NetStandardLoc) /out:$(OutputDir)\$(AssemblyName).dll $(OutputDir)\$(AssemblyName).dll $(OutputDir)\System.IdentityModel.Tokens.Jwt.dll  $(OutputDir)\Microsoft.IdentityModel.JsonWebTokens.dll $(OutputDir)\Microsoft.IdentityModel.Tokens.dll $(OutputDir)\Microsoft.IdentityModel.Logging.dll $(OutputDir)\Newtonsoft.Json.dll $(OutputDir)\Microsoft.Extensions.Configuration.Json.dll" />
  </Target>

現在對於單元測試項目,我們有一些參考資料需要包含在我們沒有執行 ILRepack 的情況下,例如從 Visual Studio 構建。

對於正常的構建,我想傳遞/p:RunILRepack=false以允許我運行單元測試、獲取代碼覆蓋率並對代碼執行 sonarqube 分析。

在單元測試項目中,我聲明了以下內容:

  <PropertyGroup Condition="'$(RunILRepack)' == ''">
    <RunILRepack>false</RunILRepack>
  </PropertyGroup>
  <Choose>
    <When Condition="'$(RunILRepack)' == 'false'">
      <ItemGroup>
        <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.2.4"  />
        <PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="5.2.4" />
        <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="5.2.4" />
        <PackageReference Include="Microsoft.IdentityModel.Logging" Version="5.2.4" />
        <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
      </ItemGroup>
    </When>
  </Choose>

我嘗試過但沒有成功的替代選項是:

      <ItemGroup Condition="'$(RunILRepack)' == 'false'">
        <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.2.4"  />
        <PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="5.2.4" />
        <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="5.2.4" />
        <PackageReference Include="Microsoft.IdentityModel.Logging" Version="5.2.4" />
        <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
      </ItemGroup>

並將 PackageReferences 移動到一個單獨的.proj 文件,並對導入設置條件。

我的上述工作按預期工作。

在第二次通過時,我想傳遞/p:RunILRepack=true ,這一次它應該運行 ILRepack 並在我們的主要 dll 和打包中包含一些程序集引用,以便我們可以發布 package。

現在對於第二次構建,我總是會收到一個構建錯誤,例如:

錯誤 CS0433:“Microsoft.IdentityModel.Tokens, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”和“Company.Namespace.AssemblName, Version=1.1.2.0, Culture=neutral”中都存在“RsaSecurityKey”類型PublicKeyToken=null'

錯誤 CS0433:“RsaSecurityKey”類型存在於兩者中...

錯誤 CS0433:類型 'JsonWebKey' 存在於...

所以這意味着這些引用是導入的,盡管不應該是這樣。

到目前為止,我能夠在傳遞/p:RunILRepack=true時構建項目的唯一方法是完全刪除上面列出的 package 引用。

如何包含這些 PackageReference 項,以便僅在我們設置/p:RunILRepack=false時才導入它們?

我最終通過引入一個額外的構建配置來解決這個問題,然后將項目組條件更改為在該配置上被忽略:

  <Choose>
    <When Condition="'$(Configuration)' != 'ReleaseILMerge'">
      <ItemGroup>
        <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.2.4" />
        <PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="5.2.4" />
        <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="5.2.4" />
        <PackageReference Include="Microsoft.IdentityModel.Logging" Version="5.2.4" />
        <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
      </ItemGroup>
    </When>
  </Choose>

這是唯一有效的方法。 我不知道為什么使用屬性不起作用。 這一定是 MSBuild 或 Nuget 中的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM