如何在CI服务器上使用NuGet包与ASP.NET网站

Eri*_*k T 6 asp.net teamcity webforms vs-web-site-project nuget

我有许多ASP.NET Web窗体网站(没有.csproj文件的网站),我试图弄清楚如何最好地使用NuGet包.使用Visual Studio 2015时,通过UI添加NuGet包可以正常工作(站点根目录中有packages.config),并且构建会将二进制文件放在bin文件夹中.

问题是尝试通过MSBuild在TeamCity上构建项目.对于其他项目,我可以将NuGet.exe与restore命令一起使用(对csproj或sln文件),并正确下载包并将其包含在输出中.但是,这不适用于网站,因此编译因缺少文件而失败.

作为最后的手段,我可​​以编写一个自定义脚本/构建步骤来手动将程序集复制到bin文件夹,但我想避免这种情况.我错过了什么吗?有没有办法将NuGet用于Visual Studio之外的网站?

Eri*_*k T 6

一段时间后,我有一个解决方法可以让我到达我需要的地方,尽管不是最好的方式。

在较新版本的 Visual Studio 中,当通过 VS 将二进制依赖项添加到网站时,它会将 (binaryfile).dll.refresh 文件与二进制文件一起添加到 bin 文件夹中。该文件的内容是通过解决方案的包文件夹到 .dll 的相对路径。此外,还向网站添加了一个packages.config 文件。

让它在 CI 服务器上构建的方法是:

  1. 忽略 (.gitignore, .hgignore) 网站的 bin 文件夹
  2. 在 bin 文件夹中显式添加 .refresh 文件
  3. 在实际构建之前,调用 NuGet restore,将路径传递到网站的 packages.config 并将 PackagesDirectory(或 SolutionDirectory)设置为解决方案的包文件夹
  4. 预编译,MSBuild 将打开每个刷新文件,并从文件中包含的位置复制文件。

这不是一个很好的解决方案,因为我现在必须多次调用 NuGet restore(一次用于解决方案,一次用于每个网站),但它确实有效。我不知道支持多远的 .refresh 文件,但它在 2015 年确实有效。我可能会在 NuGet 中提出更改请求,以允许通过命令行传入多个解决方案/packages.configs。

谢谢,埃里克