2012-09-24 6 views
10

Ich habe ein Webanwendungsprojekt, das eine Drittanbieter-Assembly verweist, die wiederum einige native DLLs verwendet, die es zur Laufzeit finden muss. Aus diesem Grund wollte ich diese Dlls zum Ordner bin des Projekts hinzufügen, so dass sie definitiv gefunden werden können.Erzwingen Sie externe Dateien in bin Ordner auf Veröffentlichung kopiert werden

Wenn ich jedoch die Dateien zum Projekt in/bin/hinzufüge, wähle "copy to output", werden die Dateien kompiliert und in/bin/bin veröffentlicht. Das Hinzufügen zu den Stammordnern funktioniert, kann aber kaum die richtige Lösung sein.

sie zu der Build-target „Afterbuild“ Hinzufügen haben keine Wirkung, wenn die Veröffentlichung (z.B. „build-Bereitstellungspaket“)

Es muß auch funktionieren, wenn die Lösung über TFS Aufbau, in dem der MSBuild Ziel _CopyWebApplicationLegacy aufgerufen wird.

Antwort

7

Die Lösung war eine Kombination aus dem, was ich bereits versucht hatte:

  • den Ordner „Bin“ in das Projekt einbeziehen
  • Fügen Sie die benötigten Dateien (ich sie als Link hinzugefügt aufgrund unserer Entwicklung Struktur)
  • die folgenden Eigenschaften fest: „Aktion Bauen = Content“ und „to Output Kopieren = Nicht kopieren“ werden nun in den Ordner Ist bei der Veröffentlichung, auch kopiert

die Dateien, wenn die Automatisierung das baut auf TFS auf.

Die benötigte Komponente war GdPicture, die zur Laufzeit ein paar native DLLs verwendet.

+0

Sauberste, einfachste Lösung. – AnthonyVO

+2

Das Einschließen des Ordners "Bin" unter der Quellcodeverwaltung würde unnötige Eincheckvorgänge verursachen. – Catherine

+7

Der Ordner "bin" sollte niemals Teil der Lösung sein. Es ist nur ein Ausgabeordner. Wenn Sie Testfälle, TFS usw. verwenden, wird der Ausgabeordner umgeleitet. Das Setzen der Option "nicht kopieren" führt zu fehlenden Baugruppen. Entschuldigung zu sagen: "Sehr schlechte Idee" – Fried

2

Es ist üblich, einen Ordner lib in Ihrer Lösung oder Ihrem Arbeitsbereich zu haben, in den Sie Ihre Drittanbieter-DLLs einfügen können. Sie würden dann einen Verweis auf diesen Standort aus Ihrem Projekt hinzufügen und sicherstellen, dass dieser Standort unter der Quellcodeverwaltung steht.

Sie könnten auch mit NuGet betrachten, um dies für Sie zu verpacken, die automatisch einen Lösungspakete-Ordner verwendet.

+0

Wie hilft mir das, wenn die externe Baugruppe diese Dateien finden muss? –

+0

@Alex Wenn Sie diese Dateien in Ihrem Projekt referenziert haben, werden sie gefunden. Können Sie angeben, welche Bibliotheken das sind? – dove

+0

Sie sind native DLLs (C++ ich nehme an), und kann daher nicht als eine normale Referenz hinzugefügt werden. Die referenzierte Assembly GdPicture greift zur Laufzeit auf sie zu. –

0

Basierend auf diesem Artikel http://sedodream.com/2010/05/01/WebDeploymentToolMSDeployBuildPackageIncludingExtraFilesOrExcludingSpecificFiles.aspx. Es ist möglich, das Msbuild-Ziel in eine Hauptdatei (die neueste in der Reihenfolge der Erstellung der Lösung) zu definieren, die alle Dateien des bin-Ordners erfasst. So

<Target Name="CustomCollectFiles"> 
    <ItemGroup> 
     <_CustomFiles Include="$(OutDir)\**\*" /> 
     <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)"> 
     <DestinationRelativePath>$(OutDir)\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> 
     </FilesForPackagingFromProject> 
    </ItemGroup> 
    </Target> 
    <PropertyGroup> 
    <CopyAllFilesToSingleFolderForPackageDependsOn> 
     CustomCollectFiles; 
     $(CopyAllFilesToSingleFolderForPackageDependsOn); 
    </CopyAllFilesToSingleFolderForPackageDependsOn> 
    </PropertyGroup> 

Und legen Sie es vor dem Schließen des Stammprojektelements.