我需要在构建后运行一个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中的构建。
对于一个正常的构建,我想通过/p:RunILRepack=false来允许我运行单元测试,获得代码覆盖率并对代码执行声纳库分析。
在单元测试项目中,我声明了以下内容:
<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和pack中包含一些程序集引用,这样我们就可以发布包了。
现在,对于第二个构建,我总是会得到一个构建错误,比如:
error CS0433:类型“RsaSecurityKey”同时存在于“Microsoft.IdentityModel.Tokens、Version=5.2.4.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35”和“Company.Namespace.AssemblName,Version=1.1.2.0,Culture=neutral,PublicKeyToken=null”中。
错误CS0433:类型'RsaSecurityKey‘存在于两个.
错误CS0433:类型'JsonWebKey‘存在于两个.
这意味着这些引用是导入的,尽管情况不应该是这样的。
到目前为止,我能够在传递/p:RunILRepack=true时构建项目的唯一方法是完全删除上面列出的包引用。
如何包含这些PackageReference项,以便只在设置/p:RunILRepack=false时才导入这些项
发布于 2020-05-27 13:02:12
我最终通过引入额外的构建配置来解决这个问题,然后更改了在该配置上被忽略的item组条件:
<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中的一个bug。
https://stackoverflow.com/questions/62026843
复制相似问题