2013-09-04 8 views
14

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

"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 подмодуля?

Благодаря

+0

Возможный дубликат [NuGet не получает недостающие пакеты] (http://stackoverflow.com/ques/17797052/nuget-not-getting-missing-packages) –

ответ

8
+1

Пожалуйста, отметьте как «ответ», чтобы это не отображалось в неустановленной куче. Благодарю. – granadaCoder

+1

Абсолютно нет. Библиотечному проекту не нужно знать подробности о проекте-хозяине, который ссылается на него. -1. – Nuzzolilo

+0

Это изменилось в новейшей версии NuGet? – SuperJMN

11

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> 

к:

<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> 

Надежда эта помощь!

+0

Если вам нужно изменить каждый проект в подмодуле, вы эффективно модифицируете подмодуль, то есть большой нет. Как поясняет @ Nuzzolilo ниже, библиотека не должна знать ничего о проектах, которые ее используют. Они должны быть агностическими. Извините, но это неверный ответ. – SuperJMN

+0

Да, конечно, это нужно использовать, только если вы владеете подмодулем и знаете, что делать с этим трюком. Спасибо за разъяснение – Srounsroun

0

Если вы используете VS2015 Update 1 или новее, вы можете convert your project to use project.json to fix this.

Короче:

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

Добавить project.json с:

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

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

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

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

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

<SkipValidatePackageReferences>true</SkipValidatePackageReferences> 

Это необходимо, чтобы перейти к первому <PropertyGroup> что не установлен атрибут Condition Если не один, просто добавьте еще один в верхней части, как:

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

вы можете использовать символические ссылки: После 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% 

Полного объяснения: Visual Studio Solution with Nuget git submodules

Исходный код здесь: SolutionWithGitSubmodulesAndNuget

Смежные вопросы