19

我有一个项目,其中包含来自 git 的 2 个子模块。两个项目都启用了“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不在子模块的解决方案目录中恢复?

谢谢

4

4 回答 4

19

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>

希望这有帮助!

于 2016-03-22T03:46:07.557 回答
9

找到答案:对于任何感兴趣的人:

http://www.xavierdecoster.com/how-to-nuget-package-restore-when-sharing-projects-between-solutions

NuGet 没有丢失包

于 2013-09-04T09:36:16.430 回答
5

您可以使用符号链接: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

于 2017-05-11T18:27:49.813 回答
0

如果您使用的是 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": {}
  }
}

最后再次添加你的包,在 VS 中手动dependencies或使用Install-Package或使用 nuget UI。

我还不得不Microsoft.Bcl.*从我的项目中删除任何包,因为它们明确地寻找一个packages.config文件。

编辑:这个(删除Microsoft.Bcl.*包会给你一个编译时错误,即使项目会很好地构建,因为.targets文件Microsoft.Bcl.Build添加仍然会寻找packages.config.

要抑制这种情况,请编辑您的项目文件并添加:

<SkipValidatePackageReferences>true</SkipValidatePackageReferences>

这需要转到第一个<PropertyGroup>没有Condition属性集的地方。如果没有,只需在顶部添加另一个,例如:

<PropertyGroup>
    <SkipValidatePackageReferences>true</SkipValidatePackageReferences>
</PropertyGroup>
于 2017-03-30T12:18:08.467 回答