#visual-studio #.net-core #msbuild #nuget
#visual-studio #.net-core #msbuild #nuget
Вопрос:
У меня есть ProjectA и ProjectB
ProjectA
Это стандартный проект dotnet с выводом и exe-файлом, который будет использоваться как инструмент. Это создает пакет nuget при сборке, используя свойство и свойство, чтобы пометить пакет как инструмент. Он также помечен как автоматически исключаемый из проектов, в которых устанавливается пакет nuget, когда они также генерируют пакет nuget.
<Project Sdk="Microsoft.Net.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<AssemblyName>ProjectA</AssemblyName>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<IsTool>true</IsTool>
<DevelopmentDependency>true</DevelopmentDependency>
</PropertyGroup>
<ItemGroup>
<None Include="buildProjectA.props" Pack="True" PackagePath="build" />
<None Include="buildnet461ProjectA.targets" Pack="True" PackagePath="build" />
</ItemGroup>
<PropertyGroup>
</Project>
ProjectA.targets
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<GetPackageVersionDependsOn>MyCustomTask;$(GetPackageVersionDependsOn)</GetPackageVersionDependsOn>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>
<Target Name="MyCustomTask">
<!-- Idealy i would use a custom task to set PackageVersion to something different. Like 5.0.99-alpha1 102435 -->
<PropertyGroup>
<PackageVersion>5.0.99-alpha1 102435</PackageVersion>
</PropertyGroup>
</Target>
</Project>
ProjectB
Устанавливает ссылку на пакет nuget, созданный ProjectA.
<PropertyGroup>
<TargetFrameworks>net461</TargetFrameworks>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ProjectA" Version="1.0.0" PrivateAssets="all" />
</ItemGroup>
При сборке ProjectB в obj / folder создаются следующие файлы:
- .csproj.nuget.g.props
- .csproj.nuget.g.targets
Эти файлы включают импорт в цели и реквизиты ProjectA из кэша пакетов nuget по адресу: %userprofile%.nuget projecta 1.0.0 build ProjectA.targets и т. Д
Msbuild -t:pack игнорирует этот импорт при запуске, и, следовательно, build ProjectB никогда не устанавливает PackageVersion на 5.0.99-alpha1 102435, как я и ожидал.
Добавление вышеупомянутого содержимого ProjectA.targets непосредственно в ProjectB.csproj работает.
У кого-нибудь есть какие-либо предложения, чего мне не хватает или может быть проблема?
Ответ №1:
Если вы используете *.targets
для упаковки проекта nuget в пакет nuget на основе этого файла, вы должны сделать так, чтобы этот файл распознавался вместе с файлом csproj.
Судя по описанию, вы использовали этот файл targets для упаковки вашего проекта nuget в версию 5.0.99
.
Поэтому вы должны заставить свой csproj
работать с этим файлом следующим образом:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<!--the path of the *.targets file-->
<Import Project="xxxxxx.targets"/>
</Project>
Обновление 1
очистить кэш nuget или удалить все файлы в разделе C:Usersxxx.nugetpackages
) и msbuild -t:pack ProjectB.csproj
проверить его.
Обновление 1
Вместо этого измените файл Project B.csproj:
используйте <TargetFramework>net461</TargetFramework>
вместо <TargetFrameworks>net461</TargetFrameworks>
.
Многоплатформенная платформа, похоже, снижает производительность целевого файла, мне также любопытно, почему это происходит. Но это совет. Вы должны использовать это.
Комментарии:
1. Я обновил свой вопрос, чтобы лучше отразить мои настройки, что должно прояснить, что у меня нет проблем с созданием пакета nuget. Но вместо этого расширяет цель msbuild -t: pack для установки пользовательских свойств во время pack.
2. Вы сначала очистили кеши nuget (удалили все файлы
C:Usersxxx.nugetpackages
), а затем запустилиmsbuild -t:pack ProjectB.csproj
? Если у вас есть предыдущий старый nuget под этим, он всегда будет использовать старый, а не новый.3. Кроме того, при очистке кэшей nuget также удалите
bin
obj
папку и проекта B, а затем снова протестируйте. И на моей стороне со всей вашей подробной информацией я всегда получаю версию5.0.99-alpha1 102435
Project B
.4. У вас были какие-либо обновления? Я обновил свой ответ, и вы можете его проверить.
5. @Rasmus-E, проблема в том, что вы должны использовать
<TargetFramework>net461</TargetFramework>
вместо<TargetFrameworks>net461</TargetFrameworks>
. Многоплатформенная платформа, похоже, снижает производительность целевого файла, мне также любопытно, почему это происходит. Но это совет. Вы должны использовать это.