VS2010 So fügen Sie Dateien in ein Projekt ein, kopieren sie beim Erstellen oder Veröffentlichen automatisch in das Ausgabeverzeichnis

73

Die Aufgabe besteht darin, ein Visual Studio 2010-Projekt so zu erstellen, dass während eines Builds oder einer Veröffentlichung ein foo.exeDienstprogramm in das binVerzeichnis output ( ) kopiert wird .

Früh habe ich PostBuildEvent Aufgabe in .csproj (MSBuild-Datei) gemacht:

<PropertyGroup>
  <PostBuildEvent>
    Copy "$(SolutionDir)Tools\foo.exe" "$(ProjectDir)$(OutDir)foo.exe"
  </PostBuildEvent>
</PropertyGroup>

Das ist aber nicht universell. Während der Veröffentlichung (Visual Studio 2010) wird foo.exeim binVerzeichnis angezeigt , jedoch nicht in das Ausgabeveröffentlichungsverzeichnis kopiert. Vielleicht mache ich alles völlig falsch und es gibt einen Standardmechanismus, um Dateien in Projekte aufzunehmen, die später beim Erstellen oder Veröffentlichen kopiert werden sollen bin?

Dao
quelle

Antworten:

107

Es gibt und es ist nicht abhängig von Post-Build-Ereignissen.

Fügen Sie die Datei Ihrem Projekt hinzu und wählen Sie in den Dateieigenschaften unter "In Ausgabeverzeichnis kopieren" entweder "Immer kopieren" oder "Bei Neuem kopieren".

Siehe MSDN .

Oded
quelle
17
Gibt es einen Mechanismus zur Steuerung des Ausgabe-Unterverzeichnisses? Ich habe foo.exein Lösung gesetzt \Tools\Foo\foo.exeund während der Veröffentlichung foo.exewird nach kopiert bin\Tools\Foo\foo.exe. Für Code von Drittanbietern muss foo.exe direkt im binOrdner abgelegt werden . Ich habe bereits Namespace ProviderEigenschaften für Toolsund FooVerzeichnisse deaktiviert. Das hilft aber nicht. Ich möchte nicht platzieren foo.exe, um root zu projizieren. Aber wenn es meines Wissens keine anderen Varianten gibt, wäre dies die einzige Lösung?
Dao
1
Sie können einen Lösungsordner hinzufügen und die Datei hinzufügen - ich glaube, sie wird dann in das bin-Verzeichnis kopiert.
Oded
Nein, leider gibt es keine Möglichkeit, das Erstellen / Veröffentlichen von Dateien zu steuern, die im Lösungsordner enthalten sind. Ich habe foo.exezum Projekt root aufgenommen. Nicht sehr schön, aber es funktioniert :) danke.
Dao
VS2015 hier. Wenn Sie Ihre Datei außerhalb des MVC-Projekts platziert haben (möglicherweise in einem anderen Projekt als Teil Ihrer Lösung), wird sie damit nicht veröffentlicht. sedodream.com/… hat mir geholfen, das zu beheben. Kurzversion: Fügen Sie Ihrem Properties\PublishProfiles\(pubname).pubxmleinen neuen Eintrag hinzu <PropertyGroup><PipelineCollectFilesPhaseDependsOn>. (Dies wird nur für dieses Veröffentlichungsprofil verwendet, nicht zum
Erstellen
1
Klicken Sie im Solution Explorer auf das Projekt und dann auf Hinzufügen> Neuer Ordner. Ziehen Sie Ihre Datei in diesen Ordner. Dann Build> Clean Solution und Build> Rebuild Solution. Die Ausgabe enthält jetzt einen neuen Ordner mit dieser Datei, wenn ich sie erstelle.
sinDizzy
20

Ich muss nur Dateien während eines Builds pushen, daher habe ich gerade einen Post-Build-Ereignisbefehlszeileneintrag wie den folgenden hinzugefügt:

Copy /Y "$(SolutionDir)Third Party\SomeLibrary\*" "$(TargetDir)"

Sie können dies festlegen, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt klicken und dann auf Eigenschaften> Ereignisse erstellen

Matthew Piatt
quelle
4
Wenn Sie diesen Ansatz verwenden, würde ich die folgende Änderung empfehlen:Copy /Y "$(SolutionDir)Third Party\SomeLibrary\*" "$(TargetDir)"
Codechurn
Wenn ich auf meiner Website veröffentlichen verwende, wird es in das Bereitstellungsverzeichnis kopiert? (Bisher glaube ich nicht, dass dies bei Verwendung von Publish funktioniert)
David
@codehurn - aktualisiert basierend auf Ihrem Vorschlag. Vielen Dank!
Matthew Piatt
6

Wählen Sie im Projektmappen-Explorer die Dateien aus, die in das Ausgabeverzeichnis kopiert werden sollen, und weisen Sie zwei Eigenschaften zu: - Aktion erstellen = Inhalt - In Ausgabeverzeichnis kopieren = Immer kopieren

Dies wird den Trick tun.

user3110417
quelle
10
Dies funktioniert nur, wenn auf die Datei in einem Projekt verwiesen wird und nicht in der Lösung über die Liste "Lösungselemente" im Projektmappen-Explorer.
Codechurn
3
  1. Fügen Sie die Datei Ihrem Projekt hinzu.
  2. Gehen Sie zu den Eigenschaften dieser Datei.
  3. Setzen Sie "Build Action" auf Embedded Resource.
  4. Stellen Sie "In Ausgabeverzeichnis kopieren" auf "Immer kopieren".
5ervant
quelle
Gilt das nur für .NET oder hängt es auch mit Naivität zusammen?
Serup
@serup Es ist für Visual Studio.
5ervant
0

In meinem Fall hat das Setzen Copy to Output Directoryauf Copy Alwaysund Build nicht den Trick gemacht, während Rebuild dies getan hat.

Hoffe das hilft jemandem!

Joel
quelle
0

Fügen Sie direkt einen Verweis auf die fehlenden DLLs aus Ihrem Service- / Webprojekt hinzu . Das Hinzufügen der Referenzen zu einem anderen Projekt hat bei mir nicht funktioniert.

Ich musste dies nur tun, wenn ich meine Web-App veröffentlichte, da nicht alle erforderlichen DLLs kopiert wurden.

goku_da_master
quelle
0

Nur damit meine Kameraden mit neuronalen Beeinträchtigungen hier darauf stoßen könnten, hatte ich angenommen, dass für Webprojekte, wenn die verknüpfte Datei eine externe .config-Datei wäre, das "Ausgabeverzeichnis" dasselbe Verzeichnis wäre, in dem web.config lebt. dh das Stammverzeichnis Ihres Webprojekts. Rückblickend ist es nicht überraschend, dass die verknüpfte Datei in den Ordner root / bin kopiert wird.

Wenn es sich also um eine appSettings-Include-Datei handelt, ist das offene Tag Ihrer web.config

<appSettings file=".\bin\includedAppSettingsFile.config">

Duh.

William T. Mallard
quelle