【问题标题】:NuGet / MSBuild not copying binaries to local output folder without HintPathNuGet / MSBuild 不将二进制文件复制到没有 HintPath 的本地输出文件夹
【发布时间】:2016-08-05 01:34:58
【问题描述】:

我已编辑全局 nuget.config 以使用单个包文件夹。

我有一个由 VS2015 创建的新空白 C# 控制台项目。我添加了一个 NuGet 引用,例如 Newtonsoft.Json,然后 VS 创建一个 packages.config 并将 Newtonsoft.Json 列为一个包。

这将被添加到 .csproj 文件中。

<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <HintPath>..\..\..\CxCache\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> <Private>True</Private> </Reference>

在构建项目时,Newtonsoft.Json 二进制文件被复制到本地 bin 文件夹中。如果我从本地 bin 中删除 Newtonsoft.Json dll,它将在构建后重新复制。

但是我不想在 csproj 中使用 HintPath 属性(不想签入 repo)所以我想,我应该能够删除 HintPath 并且它会正常工作。我从 .csproj 中删除 HintPath 行并从本地 bin 中删除 Newtonsoft.Json dll。

这次在构建时,全局 nuget 包文件夹中的 Newtonsoft.Json 二进制文件不会复制到本地 bin。有解决办法吗?

【问题讨论】:

  • 通常你会使用“在构建时恢复包”来避免检查 NuGet ......(显然不是你问题的答案,但可能你应该这样做)

标签: c# .net visual-studio msbuild


【解决方案1】:

Bin 文件夹 (TargetDir) - 您构建的文件夹不应成为源代码管理的一部分。你需要 HintPath 因为没有它,IDE 将首先检查 GAC,然后检查 TargetDir,然后检查......它可能会找到完全不同的 Newtonsoft dll驱动器上某处的版本,错误的文件。

您需要更正您的设置 - 永远不要将任何 bin 文件夹签入源代码管理。您应该有分支结构并在您的分支下有 packages 文件夹,并且您分支中的所有解决方案都可以使用它。您可以检查整个 packages 文件夹,这样就不需要每次都下载解决方案 - 这没关系。但永远不要检查输出。请参阅 - HintPath 可以包含相对路径,以便您随心所欲地使用您的结构。明天您可以将您的分支移动到源代码管理中的不同位置,并且您的相对路径将保持有效。绝对 - 你需要 HintPath

【讨论】:

  • 非常感谢。我就这么理解。但是,我不想要提示路径的原因是使用此 repo 的其他人将拥有自己的全局包位置。所以 Visual Studio 作为 HintPath 输入的内容可能只对我有效。我只是想知道为什么 NuGet 不能查看 packages.config 并检查全局包文件夹。
  • @AndrewPham 在构建项目/解决方案时,不涉及 nuget。是 IDE/msbuild 试图建立参考位置。项目文件是一个编译指令。如果您和其他开发人员从不同的角度工作 - 这就是问题。所有开发人员都必须(也就是说,如果您想拥有美好的生活),必须具有相同的代码结构。如果您正在谈论编译代码的某种存储位置 - 使用网络文件夹并使用构建后事件将 targetdir 的内容复制到该位置。
  • 在VS体验中,您可以一键下载一个nuget包到全局文件夹,复制到targetdir并进入packages.config。如果没有 HintPath,真的不可能有相反的情况吗?通过阅读 packages.config 以查找所需的二进制文件并使用 nuget.config 查找全局文件夹位置,然后它可以像以前一样下载 nuget 包(或者如果它已经存在则不下载)并复制到 targetdir?
  • 嘿,nvm,我刚刚意识到,我正在寻找的是 MSBuild 和 Nuget 加入功能,这有几个原因是不太可能的。一个是如果我不想使用 NuGet 作为包管理器而只使用 MSBuild 来构建。
  • @AndrewPham 看,我是一个非常庞大且基于复杂代码的构建大师。我设计了整个设置。我们没有问题。你真的明白,最好的方法 - 你下载 nuget 的东西,签入,所以它成为你的代码库。 MsBuild 由项目文件驱动。你告诉配置构建。系统 Dll 没有 HintPath,因为 VS 和 MSbuild 已编程以找到正确的框架。但对于第 3 方依赖项,情况有所不同。 MsBuild 只能触发 get nuget,因为它是解决方案的一部分。但这是驱动编译的项目文件。查看我关于构建架构的答案
猜你喜欢
  • 2021-09-16
  • 1970-01-01
  • 2022-01-15
  • 2022-01-24
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多