Мне нужно запустить задачу 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
, чтобы я мог запускать модульные тесты, получать покрытие кода и выполнить сонаркубовый анализ кода.
В проекте модульного тестирования я объявил следующее:
<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 и пакет, чтобы мы могли опубликовать sh пакет.
Теперь для этой второй сборки я буду аль способы получить ошибку сборки, например:
ошибка CS0433: тип RsaSecurityKey существует как в Microsoft.IdentityModel.Tokens, Version = 5.2.4.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35 'и' Company.Namespace.AssemblName, версия = 1.1.2.0, культура = нейтральная, PublicKeyToken = null '
ошибка CS0433: Тип' RsaSecurityKey 'существует в обоих ...
ошибка CS0433: тип 'JsonWebKey' существует в обоих ...
Это означает, что эти ссылки импортируются, хотя это не должно быть так.
Единственный способ, который у меня есть до сих пор смог получить проект для сборки при передаче /p:RunILRepack=true
- это полное удаление ссылок на пакеты, перечисленных выше.
Как я могу включить эти элементы PackageReference, чтобы они были импортированы только при установке /p:RunILRepack=false
?