Пакет Msbuild игнорирует пакеты nuget с целями и задачами

#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> . Многоплатформенная платформа, похоже, снижает производительность целевого файла, мне также любопытно, почему это происходит. Но это совет. Вы должны использовать это.