2012-02-07 7 views
23

Estoy tratando de replicar el comando "Publicar ..." de Visual Studio 2010 (aplicable a proyectos de aplicaciones web) donde en la interfaz de usuario elegiría Publicar método: "Sistema de archivos".¿Cómo usar MsBuild MsDeployPublish para el sistema de archivos local de destino?

Mi intento de esto es ...

% msbuild%/t: MsDeployPublish/propiedad: MsDeployServiceUrl = "file: /// D: \ MyDeploymentFolder"; MsDeployPublishMethod = "Sistema de archivos" "d : \ MySourceFolder \ Project.csproj "

... y haber probado un método de" FileSystem "," File System "," Local "y algunos otros.

El error que consigo implica que MSDeploy todavía está tratando de empujar a un servidor 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] 

¿Cómo se orienta el sistema de archivos para el despliegue, como Visual Studio normalmente me deja entrar la interfaz gráfica de usuario?

+0

Ver [Cómo publicar aplicación web a una ubicación específica (Nant)?] (Http://stackoverflow.com/questions/2928595) –

Respuesta

80

Según mi respuesta de 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 

O si usted está construyendo el archivo de solución:

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

Este es el Santo Grial de la construcción archivos web csproj. – Matthew

+1

Si está compilando con Visual Studio 2013, intente agregar '/ p: VisualStudioVersion = 12.0' si recibe un error que diga que el destino' WebPublish' no existe. – Matthew

+0

En caso de que esté buscando un servidor de compilación (Teamcity), especifique en el campo 'Targets:': Rebuild WebPublish, y revise esta respuesta para que WebPublishing trabaje en un servidor de agentes sin instalar visual studio: http: // stackoverflow .com/a/24245360/2901207 – CularBytes

2

Dejé de intentar hacer que MSBuild copiara archivos web desplegables (y no hice nada más que eso), así que lo guioné en PowerShell a Estoy realmente feliz con el resultado. Mucho más rápido que cualquier cosa que probé a través de MSBuild. Aquí está el quid (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 
} 
Cuestiones relacionadas