TFS NuGet 安装程序构建步骤不起作用
TFS NuGet Installer build step not working
我正在尝试配置具有 NuGet 包引用的项目的自动构建,但我没有任何运气。 (仅供参考,我对所有这些仍然很陌生,所以请提供简单的步骤 and/or 配置。)
注意:这不是其他类似问题的重复,因为我使用的是中央包存储库。其他类似的问题没有提到这个重要的细节,因此应该假设它们不相关。
构建 运行 在没有参考的情况下很好。我添加了 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\s\packages'
自然构建失败,因为它找不到依赖关系。
值得注意的是,我在我的开发机器上使用了中央包存储库:
<config>
<add key="repositoryPath" value="D:\Dev\Packages" />
</config>
我也想在服务器上模拟这种行为,例如C:\Packages\*\*.nupkg
.
我尝试使用标准 %AppData%\NuGet\NuGet.config
文件,但构建忽略了它。我尝试了 this answer 中的建议(使用 repositoryPath
而不是那里显示的 packageSources
),但这会导致服务器挂起,直到我重新启动 VSO 代理服务。认为这可能是一个权限问题,我将代理重新配置为 运行 在与 NuGet.config
的 %AppData%
位置关联的用户帐户下。仍然没有运气。没有构建。
如何让 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 引用都执行此操作……是吗?
好的,明白了。
只要服务器上的 repositoryPath
文件夹与我们的开发机器上的层数相同——相对于 Build Agent 放置项目文件的文件夹——我们就可以把它我们想要的任何地方并在项目文件中保留相对 HintPath
值。
例如,在我的例子中,我最终将服务器位置设置为 C:\Agent\Build\Packages
,以匹配我的开发机器上本地 Git 存储库的层次结构位置:
D:\Dev\Packages
D:\Dev\Git\app.repo\App\App.vbproj
效果很好。
编辑
澄清一下,将程序集从包文件夹复制到应用程序 bin
文件夹的操作不是 NuGet 操作。这是一个 MsBuild 操作(即项目程序集引用属性中的 CopyLocal 设置)。
失败的原因是 MsBuild 无法根据项目文件中指定的相对引用找到要复制的程序集。
所以从技术上讲,我的问题标题不正确。 NuGet 安装程序步骤一直运行良好。
我正在尝试配置具有 NuGet 包引用的项目的自动构建,但我没有任何运气。 (仅供参考,我对所有这些仍然很陌生,所以请提供简单的步骤 and/or 配置。)
注意:这不是其他类似问题的重复,因为我使用的是中央包存储库。其他类似的问题没有提到这个重要的细节,因此应该假设它们不相关。
构建 运行 在没有参考的情况下很好。我添加了 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\s\packages'
自然构建失败,因为它找不到依赖关系。
值得注意的是,我在我的开发机器上使用了中央包存储库:
<config>
<add key="repositoryPath" value="D:\Dev\Packages" />
</config>
我也想在服务器上模拟这种行为,例如C:\Packages\*\*.nupkg
.
我尝试使用标准 %AppData%\NuGet\NuGet.config
文件,但构建忽略了它。我尝试了 this answer 中的建议(使用 repositoryPath
而不是那里显示的 packageSources
),但这会导致服务器挂起,直到我重新启动 VSO 代理服务。认为这可能是一个权限问题,我将代理重新配置为 运行 在与 NuGet.config
的 %AppData%
位置关联的用户帐户下。仍然没有运气。没有构建。
如何让 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 引用都执行此操作……是吗?
好的,明白了。
只要服务器上的 repositoryPath
文件夹与我们的开发机器上的层数相同——相对于 Build Agent 放置项目文件的文件夹——我们就可以把它我们想要的任何地方并在项目文件中保留相对 HintPath
值。
例如,在我的例子中,我最终将服务器位置设置为 C:\Agent\Build\Packages
,以匹配我的开发机器上本地 Git 存储库的层次结构位置:
D:\Dev\Packages
D:\Dev\Git\app.repo\App\App.vbproj
效果很好。
编辑
澄清一下,将程序集从包文件夹复制到应用程序 bin
文件夹的操作不是 NuGet 操作。这是一个 MsBuild 操作(即项目程序集引用属性中的 CopyLocal 设置)。
失败的原因是 MsBuild 无法根据项目文件中指定的相对引用找到要复制的程序集。
所以从技术上讲,我的问题标题不正确。 NuGet 安装程序步骤一直运行良好。