visual studio 2010 tag Wie fügen Sie zusätzliche Dateien mithilfe von VS2010-Webbereitstellungspaketen hinzu?




wordpress meta description einfügen (5)

Ich teste gerade die neue Web-Packaging-Funktionalität in Visual Studio 2010 aus und stieß auf eine Situation, in der ich ein Pre-Build-Event nutze, um benötigte DLLs in meinen Bin-Ordner zu kopieren, auf den meine App für API-Aufrufe angewiesen ist. Sie können nicht als Referenz verwendet werden, da es sich nicht um COM-DLLs handelt, die mit Interop verwendet werden können.

Wenn ich mein Bereitstellungspaket erstelle, werden diese Dateien ausgeschlossen, wenn ich die Option auswähle, dass nur die zum Ausführen der App erforderlichen Dateien enthalten sind. Gibt es eine Möglichkeit, die Bereitstellungseinstellungen so zu konfigurieren, dass sie diese Dateien enthalten? Ich hatte kein Glück, eine gute Dokumentation zu diesem Thema zu finden.


Große Frage. Ich habe gerade einen sehr detaillierten Blogeintrag dazu im Web Deployment Tool (MSDeploy) veröffentlicht: Build Package mit zusätzlichen Dateien oder Ausschluss bestimmter Dateien .

Hier ist die Zusammenfassung. Nach dem Einschließen von Dateien zeige ich, wie man auch Dateien ausschließt.

Einschließlich zusätzlicher Dateien

Das Hinzufügen zusätzlicher Dateien in das Paket ist ein bisschen schwieriger, aber immer noch kein Großbuchstabe, wenn Sie mit MSBuild vertraut sind, und wenn Sie dies nicht tun, dann lesen Sie dies. Um dies zu tun, müssen wir uns in den Teil des Prozesses einklinken, der die Dateien für die Verpackung sammelt. Das Ziel, das wir erweitern müssen, heißt CopyAllFilesToSingleFolder. Dieses Ziel verfügt über die Abhängigkeitseigenschaft PipelinePreDeployCopyAllFilesToOneFolderDependsOn, auf die wir zugreifen und unser eigenes Ziel injizieren können. Wir werden also ein Ziel mit dem Namen CustomCollectFiles erstellen und dieses in den Prozess einfügen. Das erreichen wir mit folgendem (erinnern Sie sich nach dem Import-Statement).

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

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

Dies wird unser Ziel dem Prozess hinzufügen, jetzt müssen wir das Ziel selbst definieren. Angenommen, Sie haben einen Ordner mit dem Namen "Extra Files", der 1 Stufe über Ihrem Webprojekt liegt. Sie möchten alle diese Dateien einschließen. Hier ist das CustomCollectFiles-Ziel und wir diskutieren danach.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Hier habe ich das Item _CustomFiles erstellt und im Include-Attribut aufgefordert, alle Dateien in diesem Ordner und darunter liegenden Ordner abzuholen. Falls Sie etwas aus dieser Liste ausschließen müssen, fügen Sie _CustomFiles ein Exclude Attribut _CustomFiles .

Dann verwende ich dieses Element, um das FilesForPackagingFromProject-Element aufzufüllen. Dies ist das Element, das MSDeploy tatsächlich verwendet, um zusätzliche Dateien hinzuzufügen. Beachten Sie auch, dass ich den DestinationRelativePath-Metadaten-Wert deklariert habe. Dies bestimmt den relativen Pfad, in dem es im Paket platziert wird. Ich habe hier die Anweisung Extra Files% (RecursiveDir)% (Dateiname)% (Extension) verwendet. Das bedeutet, dass Sie es an demselben relativen Speicherort im Paket platzieren müssen wie im Ordner "Extra-Dateien".

Dateien ausschließen

Wenn Sie die Projektdatei einer mit VS 2010 erstellten Webanwendung unten öffnen, finden Sie eine Zeile mit.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

Übrigens können Sie die Projektdatei innerhalb von VS öffnen. Klicken Sie mit der rechten Maustaste auf die Projektauswahl Projekt entladen. Klicken Sie dann mit der rechten Maustaste auf das entladene Projekt und wählen Sie Projekt bearbeiten.

Diese Erklärung enthält alle Ziele und Aufgaben, die wir benötigen. Die meisten unserer Anpassungen sollten nach diesem Import erfolgen, wenn Sie nicht sicher sind, ob nach! Wenn Sie also Dateien ausschließen müssen, gibt es einen Objektnamen, ExcludeFromPackageFiles, der dazu verwendet werden kann. Angenommen, Sie haben eine Datei mit dem Namen Sample.Debug.js, die in Ihrer Webanwendung enthalten ist, aber Sie möchten, dass diese Datei von den erstellten Paketen ausgeschlossen wird. Sie können das Snippet nach dieser Importanweisung einfügen.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

Wenn Sie dieses Element auffüllen, werden die Dateien automatisch ausgeschlossen. Beachten Sie die Verwendung der FromTarget-Metadaten hier. Ich werde hier nicht darauf eingehen, aber Sie sollten wissen, dass Sie das immer angeben müssen.


Wollte kommentieren, um Emil Lerchs Kommentar oben zu betonen. Wenn Sie ein Azure SDK installiert haben, suchen Sie nach einer anderen DependencyProperty.

Im Grunde müssen Sie möglicherweise "CopyAllFilesToSingleFolderForMsdeployDependsOn" statt "CopyAllFilesToSingleFolderForPackageDependsOn" verwenden. Ich bin nicht wirklich ein fortgeschrittener MsBuild-Typ, und ich verschwendete stundenlang meine Haare, um herauszufinden, warum meine Ziele nicht angerufen wurden.

Hier ist ein weiterer Link, wenn dies für Sie nicht funktioniert und Sie ein Azure SDK installiert haben:


Also hat Sayeds Implementierung bei mir nicht funktioniert. Ich verwende VS2013 und verwende das Web Deploy-Paket und benötigte einige Plugin-DLLs aus einem anderen Ordner in die Bin des Deploy-Pakets. Hier ist, wie ich es geschafft habe (viel einfacher):

Fügen Sie unten in Ihrer csproj-Datei Folgendes hinzu:

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <ItemGroup> 
        <Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />  
</Target>

Andere Erwähnungen in der csproj-Datei:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployOnBuild>true</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath>
    <DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation>
    <FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish>
    <ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol>
    <PublishDatabases>false</PublishDatabases>
</PropertyGroup>

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" />

Eine einfachere Lösung besteht darin, die csproj-Datei so zu bearbeiten, dass sie die erforderliche DLL in den bin-Ordner einfügt, und anschließend ein vorbereitendes Ziel zum Kopieren des Elements in den bin-Ordner aus dem allgemeinen Bibliotheksordner erstellt, in dem wir unsere Drittanbieter-DLLs speichern. Da das Element in der Lösungsdatei vorhanden ist, wird es von msbuild / msdeploy bereitgestellt und es ist nichts Kompliziertes erforderlich.

Tag verwendet, um Datei ohne Hinzufügen von VS (die es in der Regel zu Ihrem VCS hinzufügen möchten) enthalten

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

Dies ist das BeforeBuild-Ziel, das für mich funktioniert hat:

<Target Name="BeforeBuild">
    <Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
    <Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

Bearbeitet, um den Vorschlag von @ tuespetre einzuschließen, den Eintrag zu verbergen und somit den vorherigen Nachteil eines sichtbaren Bin-Ordners zu entfernen. Von mir nicht bestätigt.


Als Ergänzung zu Sayeds Antwort fand ich, dass eine statische Deklaration von ExcludeFromPackageFiles-Elementen in meinem Projekt nicht ausreichend war. Ich musste bestimmte DLLs ausschließen, die erst nach der Kompilierung verfügbar waren (Azure-spezifische Ninject-Module, die bei der Bereitstellung in IIS nicht benötigt werden).

Also habe ich versucht, meine ExcludeFromPackageFiles-Liste mit dem CopyAllFilesToSingleFolderForPackageDependsOn-Trick Sayed, der oben gepostet wurde, zu erstellen. Dies ist jedoch zu spät, da der Verpackungsprozess die ExcludeFromPackageFiles-Elemente bereits entfernt hat. Also habe ich die gleiche Technik benutzt, aber etwas früher:

<PropertyGroup>
    <ExcludeFilesFromPackageDependsOn>
        $(ExcludeFilesFromPackageDependsOn);
        _ExcludeAzureDlls
    </ExcludeFilesFromPackageDependsOn>
</PropertyGroup>

<Target Name="_ExcludeAzureDlls">
    <ItemGroup>
        <FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)"
                               Exclude="%(RootDir)%(Directory)*Azure*.dll" />
        <AzureFiles Include="@(FilesForPackagingFromProject)"
                    Exclude="@(FilesForPackagingFromProjectWithNoAzure)" />
        <ExcludeFromPackageFiles Include="@(AzureFiles)">
            <FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget>
        </ExcludeFromPackageFiles>
    </ItemGroup>
</Target>

Hoffe das hilft jemandem ...





msdeploy