如何在PowerShell中实现与Visual Studio内的发布功能完全相同的功能

18
我想知道如何在PowerShell中像在Visual Studio中一样发布。当你使用MVC项目启动Visual Studio时,然后右键单击项目并选择“发布”;会出现一个对话框,在其中填写一些设置,然后再次点击“发布”。它会在预期的方式下将您的网站推出去,也会创建一个文件来保存这些设置。projectName.Publish.xml。
这个文件是我想要能够以完全相同的方式使用它的原因。有一些设置可以在PowerShell中操纵,以将应用程序推送到具有不同配置的多个站点。
我查看了“msbuild target:publish”,它仅生成(从包含.csproj的目录运行):
MSBUILD : error MSB1009: Project file does not exist.
Switch: target:publish 

我尝试使用 "msbuild projectfile target:publish" 命令,它会产生以下输出:

MSBUILD : error MSB1008: Only one project can be specified.
Switch: target:build

我还看了几个msdeploy的变种。难道这很困难吗?如果你可以在工作室中右键单击,肯定有某个可以执行该任务的东西。

我开始怀疑这是否需要满月并割掉鸡头。(我在这上面花费了太多时间!)

**编辑:我尝试了Lee的建议:

msbuild target:publish Mvc.csproj

这会产生以下错误:

MSBUILD : error MSB1008: Only one project can be specified.
Switch: Mvc.csproj

For switch syntax, type "MSBuild /help"

**编辑:根据DaveE的建议,我尝试了以下方法:

msbuild target:publish Mvc.csproj

这会导致产生错误:

MSBUILD : error MSB1009: Project file does not exist.
Switch: target:publish=PassportHealth.PatientSimple.Mvc.csproj

我也看了一下“发布”目标的文档(http://msdn.microsoft.com/en-us/library/ms165431.aspx),它明确说明语法应该是:

msbuild target:publish
所以,经过多次阅读后我的结论是:发布目标是用于单击部署.exe文件,而不是MVC Web站点。我找到了http://weblogs.asp.net/scottgu/archive/2010/09/13/automating-deployment-with-microsoft-web-deploy.aspx,该链接相当清楚地说明了此事。然而,我仍然不知道如何通过msdeploy命令使用"publish.xml"文件。

3
在msbuild中,命令行选项是使用/opt:value指定的,因此要调用发布目标,您应该使用msbuild /t:Publish proj_file.csproj - Lee
这是MSDN MSBUILD概述(VS2008)的链接:http://msdn.microsoft.com/zh-cn/library/ms171452.aspx - DaveE
1个回答

21

projectName.publish.xml文件仅在Visual Studio中用于一键发布。对于MSBuild,您需要直接在命令行上传递一堆参数(/p:Param1=value1; Param2=value2; ...)。例如:

/p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=True /p:MSDeployPublishMethod=InProc /p:MSDeployServiceUrl=localhost /p:DeployIisAppPath="Default Web Site/NewOrleansJazz" /p:UserName=domain\user /p:Password=myPassword (source)

请注意,在发布的VS11 Preview版本(在BUILD会议上发布),有一个新文件取代了projectName.publish.xml:MyPublishSettings.pubxml。该文件基本上是publish.xml文件和projectName.wpp.targets的组合,同时也分为每个配置文件而不是将它们全部保存到publish.xml中,例如TestSettings.pubxml,ProductionSettings.pubxml等,并且可以使用msbuild MyProject.csproj /t:WebPublish /p:PublishProfile="myProfile"更简单地从命令行使用。

[编辑:]关于您帖子中的信息,有几点需要注意:

  1. 关于只指定一个项目的错误可能是由于不正确地指定目标造成的。除了项目名称之外,传递给msbuild的所有参数都以/开头,例如/t[arget]:foo /p[roperty]:var=value
  2. 发布目标实际上与Web发布无关。如果我没记错的话,它与发布OneClick应用程序有关。在VS2010中,您应该使用/t:build /p:DeployOnBuild=true来为Web项目使用发布任务(如上所述)。在VS11中新增了/t:WebPublish,它还采用了一组更简单的参数,即您希望使用的.pubxml文件。
    • 额外说明:在构建解决方案文件时,/t:WebPublish将失败,因为在解决方案级别上未定义该目标。它只能直接用于您的Web项目的项目文件。您仍然可以在解决方案级别使用/p:DeployOnBuild=true,因为该参数值会传递给正在构建的每个项目,但不会被任何未使用该值的项目忽略。

谢谢你的回答!我已经想出了解决方法,通过使用在“Package”目标中创建的自动生成命令来解决它。关于VS2011的东西真是太棒了。我一直在想为什么我的构建配置要负责web.config转换,这似乎更与部署/发布环境有关。 - Mike
我今天刚试了一下,差不多成功了。我不得不改变 MSDeployPublishMethod=WMSVC。因为它是一个内部服务器,所以我还必须添加 AllowUntrustedCertificate=True。希望对你有帮助。 - Eric Andres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接