如何使用MsBuild MsDeployPublish来定位本地文件系统?

时间:2012-02-07 00:19:21

标签: asp.net-mvc msbuild msdeploy

我正在尝试复制Visual Studio 2010“发布...”命令(适用于Web应用程序项目),我将在UI中选择发布方法:“文件系统”。

我的尝试是......

  

%msbuild%/ t:MsDeployPublish / property:MsDeployServiceUrl =“file:/// d:\ MyDeploymentFolder”; MsDeployPublishMethod =“File System”“d:\ MySourceFolder \ Project.csproj”

...并尝试过“FileSystem”,“File System”,“Local”等方法。

我得到的错误暗示MsDeploy仍在尝试推送到IIS服务器:

"D:\MySourceFolder\Project.csproj" (MsDeployPub
lish target) (1) ->
(MSDeployPublish target) ->
  C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web
.Publishing.targets(3847,5): error : Web deployment task failed.(The metabase k
ey '/lm/w3svc' could not be found.) [D:\MySourceFolder\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.P
ublishing.targets(3847,5): error : \r [D:\MySourceFolder\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.P
ublishing.targets(3847,5): error : The metabase key '/lm/w3svc' could not be fo
und.\r [D:\MySourceFolder\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.P
ublishing.targets(3847,5): error : Unable to access the IIS configuration syste
m. Please make sure you have IIS 7 (or later) installed.\r [D:\MySourceFolder\Project.csproj]
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.P
ublishing.targets(3847,5): error : Retrieving the COM class factory for compone
nt with CLSID {2B72133B-3F5B-4602-8952-803546CE3344} failed due to the followin
g error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REG
DB_E_CLASSNOTREG)). [D:\MySourceFolder\Project.csproj]

如何定位文件系统以进行部署,因为Visual Studio通常会让我进入GUI?

4 个答案:

答案 0 :(得分:121)

根据Using MSBuild, how do I build an MVC4 solution from the command line (applying Web.config transformations in the process) and output to a folder?

的回答
msbuild ProjectFile.csproj /p:Configuration=Release ^
                           /p:Platform=AnyCPU ^
                           /t:WebPublish ^
                           /p:WebPublishMethod=FileSystem ^
                           /p:DeleteExistingFiles=True ^
                           /p:publishUrl=c:\output

或者如果您正在构建解决方案文件:

msbuild Solution.sln /p:Configuration=Release ^ 
                     /p:DeployOnBuild=True ^
                     /p:DeployDefaultTarget=WebPublish ^
                     /p:WebPublishMethod=FileSystem ^
                     /p:DeleteExistingFiles=True ^
                     /p:publishUrl=c:\output

您还可以target the project via the solution使用/t:SolutionFolder/Project:Target语法:

msbuild Solution.sln /t:SolutionFolder/ProjectFile:WebPublish ^
                     /p:Configuration=Release ^ 
                     /p:WebPublishMethod=FileSystem ^
                     /p:DeleteExistingFiles=True ^
                     /p:publishUrl=c:\output

答案 1 :(得分:2)

我放弃了尝试让MSBuild复制可部署的Web文件(除了那个之外没有做任何其他事情),所以我在PowerShell中编写脚本并且对结果非常满意。比我通过MSBuild尝试的任何东西都要快得多。这是要点(literally):

function copy-deployable-web-files($proj_path, $deploy_dir) {
  # copy files where Build Action = "Content" 
  $proj_dir = split-path -parent $proj_path
  [xml]$xml = get-content $proj_path
  $xml.Project.ItemGroup | % { $_.Content } | % { $_.Include } | ? { $_ } | % {
    $from = "$proj_dir\$_"
    $to = split-path -parent "$deploy_dir\$_"
    if (!(test-path $to)) { md $to }
    cp $from $to
  }

  # copy everything in bin
  cp "$proj_dir\bin" $deploy_dir -recurse
}

答案 2 :(得分:0)

我认为你对msbuild所说的内容并不具体。

从我的一个关于这个主题的书签中拉出来,希望它会有所帮助:http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

答案 3 :(得分:-1)

只想使用上一个答案(https://stackoverflow.com/a/20982171/915865)发布我的结果,而这正是我所需要的。

screenshot of result +1!