web-dev-qa-db-fra.com

Comment utiliser MsBuild MsDeployPublish pour cibler le système de fichiers local?

J'essaie de répliquer la commande "Publier ..." de Visual Studio 2010 (applicable aux projets d'application Web) où je voudrais dans l'interface utilisateur choisir la méthode de publication: "Système de fichiers".

Ma tentative à ce sujet est ...

% msbuild%/t: MsDeployPublish/propriété: MsDeployServiceUrl = "fichier: /// d:\MyDeploymentFolder"; MsDeployPublishMethod = "Système de fichiers" "d:\MySourceFolder\Project.csproj"

... et ayant essayé une méthode de "FileSystem", "File System", "Local", et quelques autres.

L'erreur que j'obtiens implique que MsDeploy essaie toujours de pousser vers un serveur 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]

Comment puis-je cibler le système de fichiers pour le déploiement, comme Visual Studio me permet normalement dans l'interface graphique?

37
DuckMaestro

Selon ma réponse de en utilisant MSBuild, comment puis-je créer une solution MVC4 à partir de la ligne de commande (en appliquant des transformations Web.config dans le processus) et la sortie dans un dossier?

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

Ou si vous créez le fichier de solution:

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

Vous pouvez également cibler le projet via la solution en utilisant le /t:SolutionFolder/Project:Target syntaxe:

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

J'ai renoncé à essayer de faire en sorte que MSBuild copie les fichiers Web déployables (et ne fait rien d'autre que cela), alors je l'ai écrit dans PowerShell et je suis vraiment satisfait du résultat. Beaucoup plus rapide que tout ce que j'ai essayé via MSBuild. Voici l'essentiel ( littéralement ):

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
Todd Menier

Je ne pense pas que vous soyez assez précis avec ce que vous dites à msbuild.

Tiré ceci d'un de mes signets sur le sujet, j'espère que cela aidera: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application -using-msbuild

0
Jesse