2014-10-04 7 views
5

ich andere Beiträge hier auf Stackoverflow gefunden habe, die ich erlebe, zum Beispiel mit meiner Frage beschäftigen:Einbinden von Dateien außerhalb des Projektes in MSBuild

MSBuild: Deploying files that are not included in the project sowie Include Files in MSBuild that are not a part of the project Ich wollte den Code teilen, die ich kann nach dem Lesen dieser Beiträge erstellen und bitten um Hilfe, warum es nicht funktioniert?

Um zu erläutern, was genau falsch ist und was ich vorhabe zu tun. Ich verwende Visual Studio 2012 und TFS 2012.

Ich habe eine Batch-Datei namens CreateMyFiles.bat, und was ich tun möchte, ist dies auszuführen und dann die Dateien zu nehmen, die es ausgibt (es gibt sie auf meine Includes/Javascript/Bundled-Ordner) und sie in einen Teil des Builds in MSBuild einbinden (damit sie auf dem IIS-Zielserver bereitgestellt werden).

Als ich mein lokales .csproj in meinem lokalen Visual Studio bearbeitet habe und den unten stehenden Code am Ende der Datei hinzugefügt und neu geladen habe, konnte ich mit der rechten Maustaste auf mein Webprojekt klicken, 'veröffentlichen' auswählen und dann meinen auswählen lokales dateibasiertes Publishing-Profil, das meine Dateien tatsächlich an den richtigen Ort deployed hat. Es funktionierte!

Ich dann eingecheckt in meinem Code zu TFS, und ging zu "Builds" auf TFS, und in eine neue Build eingereiht. Sicher genug, ich konnte sehen, die Dateien in das gleiche Verzeichnis auf dem Build-Server ausgegeben. Jetzt bin ich nicht 100% sicher über MSBuild, aber mir ist aufgefallen, dass genau wie beim lokalen Publizieren ein _publishedWebsite-Ordner auf dem Build-Server erstellt wurde (ein Verzeichnis über der Quelle). Die Sache ist, in diesem publishedwebsite-Ordner, meine manuell erstellten Dateien waren nicht vorhanden. Darüber hinaus hatte ich nach dem Build leider nicht die gewünschten Dateien auf dem Ziel-Webserver.

So scheint es, wenn ich manuell veröffentlichen würde, funktioniert der Code unten, aber wenn ich einen Build mit TFS in die Warteschlange stellen sollte, funktioniert es nicht. Verwendet MSBuild Publish? Könnte das der Grund sein, warum es unten nicht funktioniert?

Hier ist der Code, den ich in meiner CSPROJ Datei platziert haben:

<Target Name="CustomCollectFiles"> 
    <Exec Command="CreateMyFiles.bat" /> <!-- Generate Files --> 
    <ItemGroup> 
     <!-- Create an identity called _CustomFiles, and associate it to the files I created --> 
     <_CustomFiles Include="Includes\JavaScript\Bundled\*" /> 
     <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)"> 
     <DestinationRelativePath>Includes\JavaScript\Bundled\*%(Filename)%(Extension)  </DestinationRelativePath> 
     </FilesForPackagingFromProject> 
    </ItemGroup> 
    </Target> 

<!-- Hook into the pipeline responsible for gathering files and tell it to add my files --> 
    <PropertyGroup> 
    <CopyAllFilesToSingleFolderForPackageDependsOn> 
     CustomCollectFiles; 
     $(CopyAllFilesToSingleFolderForPackageDependsOn); 
    </CopyAllFilesToSingleFolderForPackageDependsOn> 

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

Ich bin wirklich auf diese stecken und wollte, warum die Dateien nach Hilfe fragen, vielleicht nicht gehen. Ich vermute, dass MSBuild keine Veröffentlichung verwendet und deshalb lokal funktioniert (weil ich Publish auswähle)?

so vielen Dank für Ihre Hilfe

UPDATE schon versucht, diese als pro Kommentar unten, aber dieses Mal wird die Dateien nicht einmal erschienen ist (so schien es, die Aufgaben läuft jetzt nicht einmal). Irgendeine Idee warum? Habe ich das richtig eingegeben?

<Target Name="CustomCollectFiles"> 
    <Exec Command="CreateMyFiles.bat" /> 

    <!-- Generate Files --> 
    <ItemGroup> 
    <!-- Create an identity called _CustomFiles, and associate it to the files I created --> 
     <_CustomFiles Include="Includes\JavaScript\Bundled\*" /> 
    <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)"> 
     <DestinationRelativePath>Includes\JavaScript\Bundled\*%(Filename)%(Extension)   </DestinationRelativePath> 
    </FilesForPackagingFromProject> 
    </ItemGroup> 
</Target> 

<!-- Hook into the pipeline responsible for gathering files and tell it to add my files --> 
<PropertyGroup> 
    <PipelineCollectFilesPhaseDependsOn> 
    CustomCollectFiles; 
    $(PipelineCollectFilesPhaseDependsOn); 
    </PipelineCollectFilesPhaseDependsOn> 
</PropertyGroup> 

UPDATE 2 Wenn ich den obigen Code nehmen und sie in meine pubxml Datei platzieren und führen dann eine tatsächliche veröffentlichen, es funktioniert, aber so weit ich unser Prozess-Know ist, nur einen Build Warteschlange von TFS. Ist es möglich, in den obigen Codeblock einzuhaken, wenn man einfach einen Build einreiht? Oder muss ich veröffentlichen?

CopyAllFilesToSingleFolderForPackageDependsOn

zu:

aktualisieren

CopyAllFilesToSingleFolderForMsdeployDependsOn:

Antwort

2

auf einem von TFS bauen Sie

/p:DeployOnBuild=true;PublishProfile=Release 

natürlich Ihre eigenen PublishProfile Namen

+0

Also, wenn ich ein Build in TFS einreihen, führt es * NOT * eine Veröffentlichung aus? Gibt es eine Möglichkeit, dass ich den obigen Code ausführen kann, ohne veröffentlichen zu müssen? – NullHypothesis

+0

no no veröffentlichen, es sei denn, Sie sagen es mit den oben gezeigten MSBuild-Argumenten. Sie könnten etwas Ähnliches tun, aber Ihr Code oben ist auf die Veröffentlichung ausgerichtet ich nehme an, dass "FilesForPackagingFromProject" im Code ist –

+0

Danke so was ich denke passiert ist, dass, wenn ich in der Warteschlange, ich sehe die Dateien an die verschoben werden Publishing-Ziel einfach wegen der MS-Build-Aktivität, oder? Gibt es Schaden, wenn man auch publiziert? – NullHypothesis

2

In VS2012 wurde das Ziel von umbenannt sieht aus wie die oben genannten Ziele nicht aus VS2012 Ziele immer genannt werden, können Sie ersetzen es durch einen Aufruf an das Ziel "PipelineCollectFilesPhaseDependsOn"? Das sollte es beheben.

<PropertyGroup> 
    <PipelineCollectFilesPhaseDependsOn> 
     CustomCollectFiles; 
     $(PipelineCollectFilesPhaseDependsOn); 
     </PipelineCollectFilesPhaseDependsOn>  
</PropertyGroup> 
+0

die folgenden Argumente hinzufügen müssen veröffentlichen tun Ja das stimmt, danke, aber wenn man schaut mich eigentlich tun tatsächlich habe ich das darunter (so habe ich beides). Ist das in Ordnung oder denkst du, dass es Probleme verursachen würde? Es wirft keine Fehler in Bezug auf das Kompilieren oder Speichern des Projekts auf. Vielen Dank für Ihre Hilfe :) – NullHypothesis

+0

Ich habe die Antwort aktualisiert, überprüfen Sie es und lassen Sie es mich wissen – Isaiah4110

+0

Kein Würfel - Ich aktualisiert oben - jede Chance, die Sie mir Ihre Gedanken wissen lassen könnten? danke für deine Unterstützung! – NullHypothesis

Verwandte Themen