Восстановление пакета 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>
Надеюсь на эту помощь!
Ответ 2
Найдены ответы:
Для всех, кто интересуется:
http://www.xavierdecoster.com/how-to-nuget-package-restore-when-sharing-projects-between-solutions
и
NuGet не получает недостающие пакеты
Ответ 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>