Обработайте ProjectReference как PackageReference или разрешите PackageReference для локального csproj - PullRequest
0 голосов
/ 14 мая 2018

У меня есть netstandard2.0 csproj (назовем его MyPackage), который упакован во время сборки (как указано в GeneratePackageOnBuild) в пакет nuget. Этот пакет nuget содержит пользовательские параметры и цели в каталоге сборки (поэтому ссылки на проекты получают их импортированные).

У меня есть другой проект (назовем его MyConsumer) в том же решении для тестирования MyPackage. Я хочу, чтобы MyConsumer импортировал реквизиты и цели актива сборки из MyPackage во время сборки, как если бы он использовал его как PackageReference из какого-то удаленного источника nuget.

Как мне заставить это работать (проще всего)?

Я смог сделать это с помощью очень сложного метода, когда MyConsumer добавил PackageReference в MyPackage и переопределил RestoreSources в MyConsumer, чтобы он указывал на каталог bin MyPackage. Это становится очень странным, когда выполняется сборка dotnet или сборка Visual Studio для sln, потому что метаданные проекта генерируются заранее для всех проектов во время восстановления, и, таким образом, MyPackage в этот момент не существует. Было решено добавить вложенные вызовы в MSBuild в рамках проекта MyConsumer, но затем это стало еще хуже, поскольку восстановление Visual Studio работает совершенно иначе, чем автоматическое восстановление, выполняемое сборкой dotnet.

Есть ли простой способ сделать это?

Это то, что у меня сейчас

<Project> 
  <Target Name="Build">    
    <Message Text="Running inner build" Importance="high" />

    <!-- 
    Need to call MSBuild twice, once to restore, then again to restore and build to get the restore of the Sdk to work
    because of this bug in MSBuild: https://github.com/Microsoft/msbuild/issues/2455
    Note the trailing Prop=1 is required to get MSBuild to invalid it's cache of the project target imports
    -->
    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Restore" Properties="Configuration=$(Configuration);Version=$(Version);IsInnerBuild=true;Prop=1" />
    <!-- Have to use dotnet build instead of another call to MSBuild because of another bug that prevents proper imports within the same physical process  -->
    <Exec Command="dotnet build /p:Configuration=$(Configuration) /p:Version=$(Version) /p:IsInnerBuild=true" />
    <Message Text="Finished inner build" Importance="high" />
  </Target>

  <Target Name="Restore" />

  <Target Name="RemoveBin">
    <RemoveDir Directories="bin" />
  </Target>

  <!-- Don't do real cleans old rebuild since it breaks MSBuild due to the same above bug -->
  <Target Name="Rebuild" DependsOnTargets="RemoveBin;Build">
  </Target>
</Project>

1 Ответ

0 голосов
/ 14 мая 2018

Считайте ProjectReference как PackageReference или разрешите PackageReference локальному csproj

Если я правильно понимаю, вы хотите сгенерировать пакет с проектом MyPackage, а затем установить его в тестовый проектMyConsumer и импортируйте реквизиты и цели актива сборки из MyPackage во время сборки.

Для достижения этой цели вам необходимо выполнить следующие несколько вещей:

  • Убедитесь, чтопроект MyPackage сборка до проекта MyConsumer.
  • Установка пакета в исходный текст упаковщика
  • Добавление пакета MyPackage.nupkg в тестовый проект MyConsumer во время сборки.

Подробности для выше:

  • Убедитесь, что проект MyPackage сборка до проекта MyConsumer.

Поскольку вы хотите протестировать пакет, сгенерированный проектом MyConsumer, вы должны убедиться, что этот пакет работает перед использованием тестового проекта, поэтому нам нужно установить проект MyConsumer, ссылающийся на проект MyPackage.

  • Установить пакет в источник упаковщика

Вы можете использовать событие пост-сборки для проекта MyPackage для копированияпакет MyPackage.nupkg в локальный канал, или вы можете просто добавить каталог bin MyPackage.nupkg в источник пакета.

  • Добавить пакет MyPackage.nupkg в тестовый проект MyConsumer во время сборки.

Используя VS 2017 и стиль PackageReference тестового проекта MyConsumer, вы можете установить файл Directory.Build.props в корневой каталог вашего решения.содержащий тестовый проект MyConsumer вам нужно:

<Project>
  <ItemGroup>
    <PackageReference Include="MyPackage" Version="1.0.* />
  </ItemGroup>
</Project>

Это добавит эти пакеты NuGet к тестовому проекту MyConsumer в решении, оно будет использоваться в качестве PackageReference из некоторого удаленного источника nuget.

Проверьте ответ Мартина для получения более подробной информации.

Надеюсь, это поможет.

...