31 August 2013 HowTo, WebDeploy Robert Muehsig

WebDeploy ist für mich das erste Mittel der Wahl wenn es darum geht Web-Applikationen zu verpacken und auszurollen. Ein einmal gebautes Package lässt sich leicht auf verschiedene Webserver pushen und auch Richtung Azure ist dies kein Problem.

Kleines Problem: Wie kann man zusätzliche Dateien in das WebDeploy Package mit aufnehmen?

Im Standard-Fall nimmt der WebDeploy Prozess alle Dateien die im Projekt verwendet werden – andere Dateien, welche vielleicht sogar im Ordner selbst liegen, lässt er also aus. Dies ist natürlich problematisch wenn man irgendwelche “zusätzlichen Dateien”, welche eigentlich nur indirekt mit dem Projekt zutun haben, mit in das Package aufnehmen möchte. Ein Szenario dafür wären Dateien welche man zum Download bereitstellen möchte, aber sonst nichts mit der eigentlichen Anwendung zutun haben.

Lösung: MSBuild Einstiegspunkte für WebDeploy

Dies muss in die .csproj Datei hinzugefügt werden:

   <Target Name="CustomCollectFiles">
    <ItemGroup>
      <_IncludingFiles Include="..\*.txt" />
      <FilesForPackagingFromProject Include="%(_IncludingFiles.Identity)">
        <DestinationRelativePath>SampleFolder\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
      <!-- You can use this multiple times... 
      <_AdditionalFiles Include="PATH\**\*" />
      <FilesForPackagingFromProject Include="%(_AdditionalFiles.Identity)">
        <DestinationRelativePath>WHEREEVER_YOU_WANT\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
      -->
    </ItemGroup>
  </Target>
  <PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>

    <CopyAllFilesToSingleFolderForMsdeployDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForMsdeployDependsOn>
  </PropertyGroup>

Die untere PropertyGroup muss nicht angepasst werden. Im Target “CustomCollectFiles” kann in der ItemGroup ein oder mehrere Dateien angegeben werden. Das DestinationRelativePath Element bestimmt wohin die vorher gesammelten Dateien kopiert werden sollen. Der Syntax ist etwas “kryptisch”, wenn man aber mal dahinter gekommen ist, dann passt es.

Ergebnis:

image

Das Projekt enthält nur eine “Index.html” Datei – mehr nicht. In meinem Beispiel wollte ich die drei oberen Text-Dateien, welche parallel zur .sln-Datei liegen, in das Package mit aufnehmen.

 

 

 

 

Durch die .csproj Anpassungen kommt dies in das Package:

image

Das Projekt gibts natürlich auch auf GitHub.

Weitere Informationen:

ASP.NET: ASP.NET Web Deployment using Visual Studio: Deploying Extra Files
Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!