Получение файлов / контента / ресурсов из пакетов nuget - PullRequest
0 голосов
/ 21 февраля 2020

Когда проект Visual Studio использует, как я могу получить доступ к файлам, которые являются частью пакета? Например, «Newtonsoft. Json» V12.0.3 содержит несколько файлов, кроме Newtonsoft. Json .Dll - таких как newtonsoft.json\12.0.3\lib\net20\Newtonsoft.Json.xml и newtonsoft.json\12.0.3\LICENSE.md.

Я нашел GeneratePathProperty - что здорово , но он не работает при создании SDK-проектов внутри VS2017. (При создании проектов в старом стиле, это работает).

<IncludeAssets>, похоже, ничего не делает.

Часть моего файла csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" GeneratePathProperty="true">
        <IncludeAssets>all</IncludeAssets>
    </PackageReference>

</Project>

Теперь, если я собираю из командной строки (msbuild.exe 15.9.21 + g9802d43bc3) msbuild /t:Restore;Rebuild /p:Configuration=Release /p:Platform="Any CPU" MyProject.sln

MyProject.csproj.nuget.g.props содержит

  <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
    <PkgNewtonsoft_Json Condition=" '$(PkgNewtonsoft_Json)' == '' ">%userprofile%\.nuget\packages\newtonsoft.json\12.0.3</PkgNewtonsoft_Json>
  </PropertyGroup>

Что здорово, потому что я могу использовать $ (PkgNewtonsoft_ Json) в файле моего проекта по мере необходимости, чтобы получить эти файлы.

Но, когда я строю из VS2017 (V15.9.17), мой файл * PROPS не получает этот символ, определенный: - (

-------- Обновление --------

ОК, после перезагрузки и повторной попытки все заработало :-) У меня было изменить Targets="restore;build" на Targets="restore;", иначе я получу ошибки. Учитывая Lib1 и Lib2, где Lib2 зависит от Lib1, я получаю эту ошибку

Target CoreCompile:
  Using shared compilation with compiler from directory: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn
  CSC : error CS0006: Metadata file 'C:\src\...\build\Lib2\bin\Debug\netstandard2.0\Lib2.dll' could not be found
Done building target "CoreCompile" in project "Lib1.csproj" -- FAILED.

Затем, после построения всего решения - оно терпит неудачу, и когда я собираю Lib1 снова, оно терпит неудачу с

error MSB4006: There is a circular dependency in the target dependency graph involving target "Build".```



1 Ответ

1 голос
/ 22 февраля 2020

Это здорово, потому что я могу использовать $ (PkgNewtonsoft_ Json) в файле проекта по мере необходимости, чтобы получить эти файлы. Но когда я строю из VS2017 (V15.9.17), мой файл * PROPS не получает этот символ, определенный

В глубоких исследованиях и тестах я обнаружил, что он это просто проблема в IDE VS2017, в то время как VS2019 исправила эту проблему.

xxx.csproj.nuget.g.props генерируется процессом restore . А в VS2017 для проектов с новым SDK механизм восстановления пакета VS IDE, который отличается от механизма восстановления msbuild, имел большую проблему несовместимости, что приводило к различным ситуациям. К счастью, VS2019 исправляет эту проблему.

enter image description here

В качестве предложения вы можете попробовать выполнить следующие действия:

1) скачайте последнюю версию VS2019 и используйте ее.

2) добавьте пользовательскую цель, которая содержит задачу для использования MSBuild для построения вашего проекта в xxxxx.csproj file.

<Target Name="OnceBuild" AfterTargets="Build">

    <MSBuild Projects="$(SolutionDir)$(SolutionFileName)" Targets="restore;build" Properties="Configuration=Release;Platform=Any CPU">        
    </MSBuild>   
 </Target>

Будет сгенерировано xxx.csproj.nuget.g.props, созданное MSBuild restore. Хотя это содержит ошибку MSB4006, это не повлияет на процесс сборки в VS IDE, и вам не нужно беспокоиться об этом.

Обновление 1

Просто добавьте пользовательскую цель для запуска msbuild -t:store в MSBuild

<Target Name="OnceBuild" AfterTargets="Build">    
  <MSBuild Projects="$(SolutionDir)$(SolutionFileName)" Targets="restore" Properties="Configuration=Release;Platform=Any CPU">        
   </MSBuild>   
</Target>
...