我正在尝试配置具有NuGet包引用的项目的自动构建,但我没有运气。 (仅供参考,所有这一切,我的耳朵仍然很湿,所以请提供简单的步骤和/或配置。)
注意:这不是其他类似问题的重复,因为我使用的是中央软件包存储库。其他类似的问题没有提到这个重要的细节,因此应该假设它们不相关。
构建运行正常,没有引用。我添加了Newtonsoft.Json
并通过包含这个简单的构造来绑定它:
Dim eHandling As Newtonsoft.Json.ConstructorHandling
eHandling = Newtonsoft.Json.ConstructorHandling.Default
我检查了它并且构建开始了,但是NuGet没有先将程序集复制到我的应用程序的bin
文件夹中。但是,确实将它复制到了这里:
Restoring NuGet package Newtonsoft.Json.9.0.1.
Adding package 'Newtonsoft.Json.9.0.1' to folder 'C:\Agent\_work\1\s\packages'
当然,构建失败了,因为它无法找到依赖项。
值得注意的是,我在我的开发机器上使用了一个中央软件包存储库:
<config>
<add key="repositoryPath" value="D:\Dev\Packages" />
</config>
我也想在服务器上模仿这种行为,例如C:\Packages\*\*.nupkg
。
我尝试使用标准%AppData%\NuGet\NuGet.config
文件,但构建忽略了它。我尝试了this answer中的建议(使用repositoryPath
而不是packageSources
,如图所示),但这导致服务器挂起,直到我重新启动VSO代理服务。考虑到这可能是权限问题,我将代理重新配置为在%AppData%
NuGet.config
位置关联的用户帐户下运行。仍然没有运气。没有建设。
如何让NuGet下载并填充服务器上的中央软件包存储库,然后在运行构建步骤之前将相应的依赖项复制到应用程序bin
文件夹?
编辑1
更新:显然某些东西有效,因为我现在在服务器上有一个C:\Packages\Newtonsoft.Json.9.0.1
文件夹。但是,在构建之前,程序集仍未复制到应用程序bin
文件夹。结果相同。构建失败。
编辑2
好的,我越来越近了。我在服务器上创建了一个D:驱动器,并将本地repositoryPath
值设置为D:\Dev\Packages
,与我的开发机器上的相同。构建仍然失败,但快速浏览项目XML可以发现:
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\..\..\Packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
如何处理相对路径?那应该解决它,是吗?
编辑3
好的,那很有用。我编辑了项目并将HintPath
更改为
D:\Dev\Packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll
我现在有一个成功的构建。
但这真的很快就会变得非常乏味。当然,对于每一个项目中的每一个NuGet参考,过去现在和未来,我都不会这么做......我是吗?
答案 0 :(得分:1)
好的,明白了。
只要服务器上的repositoryPath
文件夹与我们的开发机器上的级别相同 - 与构建代理放置项目文件的文件夹相关 - 我们可以将它放在任何位置希望并保留项目文件中的相对HintPath
值。
例如,在我的情况下,我最终将服务器位置设置为C:\Agent\Build\Packages
,以匹配我的开发机器上本地Git存储库的层次结构位置:
D:\Dev\Packages
D:\Dev\Git\app.repo\App\App.vbproj
效果很好。
修改强>
为了澄清,将程序集从程序包文件夹复制到应用程序bin
文件夹的操作不是NuGet操作。这是一个MsBuild操作(即项目的程序集参考属性中的CopyLocal设置)。
失败的原因是MsBuild无法根据项目文件中指定的相对引用找到要复制的程序集。
从技术上讲,我的问题标题是不正确的。 NuGet安装程序一直运行良好。