Восстановление пакета Nuget с подмодулем git

У меня есть проект, где я включает в себя 2 подмодуля из git. Оба проекта поддерживают "восстановление пакета nuget", также является родительским проектом. Папка пакета в двух включенных подмодулях не проверяется, не существует в проверенных проектах. При создании родительского проекта Nuget пытается восстановить пакеты во вложенных папках, но в папку с неправильным пакетом!

"C:\Dev\git\oasisdb\odb_oasis_repository\ODB_OASIS_Repository\.nuget\NuGet.exe" install "C:\Dev\git\oasisdb\odb_oasis_repository\odb_oasis_rvm\ODB_OASIS_RVM_EF\ODB_OASIS_RVM_EF\packages.config" -source ""  -NonInteractive -RequireConsent -solutionDir "C:\Dev\git\oasisdb\odb_oasis_repository\ODB_OASIS_Repository\ "

Почему nuget не восстанавливается в решении dir подмодуля?

Спасибо

Ответ 1

Nuget восстанавливает пакет в открытой директории решений.

Вы можете отредактировать проект .csproj проекта подмодуля и изменить ссылки на dll пакета:

   <ItemGroup>
    <Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Rest.ClientRuntime.2.1.0\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath>
      <Private>True</Private>
    </Reference>

to:

 <ItemGroup>
<Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <HintPath>$(SolutionDir)\packages\Microsoft.Rest.ClientRuntime.2.1.0\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath>
  <Private>True</Private>
</Reference>

Надеюсь на эту помощь!

Ответ 3

Вы можете использовать ссылку: После NuGet загрузки всех пакетов решений packages каталога, создать символическую ссылку в подмодуле корневой директории (имена packages и ссылку на уровень решения packages каталог). Вкратце - в вашем проекте запуска добавьте событие Pre-Build, которое создает символическую ссылку между вашим каталогом packages решений и всеми вашими packages субмодулей:

Это партия:

SET sourceDir=$(SolutionDir)packages
SET destDir=$(SolutionDir)..\..\submodules\saturn72\src\packages

if not exist %sourceDir% mkdir %sourceDir%

if not exist %destDir% mklink /j %destDir% %sourceDir%

Полное объяснение и исходный код: SolutionWithGitSubmodulesAndNuget

Ответ 4

Если вы используете VS2015 Update 1 или новее, вы можете конвертировать ваш проект, чтобы использовать project.json, чтобы исправить это.

Короче:

  • Запустите Uninstall-Package <package name> -Force -RemoveDependencies для всех ваших пакетов. Вы можете захотеть скопировать свою packages.config в блокнот перед тем, как это сделать.
  • Удалить packages.config из проекта, сохранить проект, выгрузить
  • Отредактируйте файл проекта и удалите:
    • Любые ссылки на файлы .props вверху, связанные с nuget
    • Любые <Reference> элементы, которые ссылаются на пакет
    • Файлы .targets внизу этого ссылочного nuget - обычно начинаются с: <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    • Если ваши пакеты содержат анализаторы Roslyn, обязательно удалите их.
  • Сохраните файл и переустановите проект

Добавьте project.json с помощью:

{
  "dependencies": {
  },
  "frameworks": {
    ".NETFramework,Version=v4.6.1": {}
  },
  "runtimes": {
    "win": {}
  }
}

Наконец, добавьте свои пакеты снова, либо вручную под dependencies, либо используя Install-Package, либо с пользовательским интерфейсом nuget в VS.

Мне также пришлось удалить любые пакеты Microsoft.Bcl.* из моих проектов, потому что они явно ищут файл packages.config.

EDIT: это (удаление пакетов Microsoft.Bcl.* даст вам ошибку времени компиляции, даже несмотря на то, что проект будет построен отлично, поскольку добавление .targets файла Microsoft.Bcl.Build будет по-прежнему искать packages.config.

Чтобы подавить это, отредактируйте файл проекта и добавьте:

<SkipValidatePackageReferences>true</SkipValidatePackageReferences>

Для этого нужно перейти к первому <PropertyGroup>, который не имеет набора атрибутов Condition. Если его нет, просто добавьте еще один вверху, например:

<PropertyGroup>
    <SkipValidatePackageReferences>true</SkipValidatePackageReferences>
</PropertyGroup>