我有一个网站项目,我试图通过 TeamCity 和 WebDeploy 进行部署。

因为这是一个网站而不是一个 Web 应用程序,所以我没有 .vbproj 或 .csproj 文件。

我从 this 帖子中得出的结论是,我需要创建一个 .publishproj 文件,因为 MSbuild 使用它作为它的构建文件。

然而,当 TeamCity 调用 MSBuild 时,它会出现以下错误:-
Failed to start MSBuild.exe. Failed to detect default target(s) in the project file C:\TeamCity\buildAgent\work\d9dda73c7948f14a\MainSite\website.publishproj. Please define targets explicitly in the build configuration options on TeamCity Web UI. Project does not define DefaultTargets or InitialTargets.
我查看了 .publishproj 文件,但没有定义目标。

我还关注了 Troy Hunt 的关于 Web 应用程序的 You're deploying it wrong 文章,这很好用。

任何人都可以建议我如何从 Team City 网络部署网站(不是网络应用程序)?

最佳答案

我从未与 web-site-not-a-web-project 合作过,所以请谨慎对待。
website.publishproj 似乎是在您触摸 Visual Studio 中的 Build > Publish Web Site 菜单并导入 Microsoft.WebSite.Publishing.targets 的那一刻创建的,这很好,因为它与您的普通 Web 项目( Microsoft.WebApplication.targets )导入的类似目标文件相同,两者都导入 Microsoft.Web.Publishing.targets

与 Visual Studio 创建的任何项目不同,它没有 DefaultTargets = BuildOutputPath 属性,因此您需要在 MSBuild build step 中明确指定 Targets ,并在 Microsoft.WebSite.Publishing.targetsMicrosoft.Web.Publishing.targets 中定义任何目标。

您可以调用您的标准 msbuild website.publishproj /t:Package /p:OutputPath=.\ 以在 .cmd 中生成 .zip 和相应的 obj\Debug\Package 。然后只需调用 .cmd 或将 .zip 传递给 msdeploy.exe -source:package=.zip 或尝试执行 /t:Build /p:DeployOnBuild=true 但我怀疑您会丢失由普通 Web 项目预定义的大量属性。

编辑:

某处似乎有一个循环引用,你最终会得到一个包含 PackageTmp\_PublishedWebsites 自身 2/3 副本的包,所以使用 OutDirOutputPathPackageDestinationRoot 等等来消除重复项。创建一个示例 Web 项目并通读 .csproj.targets 以获得想法。

编辑:

如果您通过发布向导,您还将获得 App_Data\PublishProfiles\Foo.pubxml 以及通过 PublishProfileName/WebPublishProfileFile 读取的代码,导入它可以节省一些输入时间。 This 可能是相关的。

编辑:

正确的网络目标的导入似乎是 2012/2013 年的一个新功能,2010 年你需要使用 aspnet_compiler

aspnet_compiler -v Foo -p . -f obj
msdeploy -verb:sync -source:iisApp=%CD%\obj -dest:iisApp="Default Web Site/foo"

10-07 19:01