2009-05-01 14 views
4

Aus irgendeinem Grund haben wir ein Skript, das Batch-Dateien für XCOPY unsere kompilierten Assemblys, Konfigurationsdateien und verschiedene andere Dateien zu einer Netzwerkfreigabe für unsere Betatester erstellt. Wir machen einen Installer, aber einige haben nicht die erforderlichen Berechtigungen für das Installationsprogramm ausführen, oder sie laufen über Citrix.Inhaltsdateien und primäre Ausgabe programmgesteuert abrufen

Wenn Sie über Ihren Schreibtisch bei den Erwähnungen von XCOPY und Citrix übergaben, verwenden Sie es als eine Entschuldigung, um früh nach Hause zu gehen. Bitte.

Der Code hat derzeit Hunderte von Zeilen wie:

CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG); 

Früher war es noch schlimmer, mit 20 int Parameter (eine pro Dateityp) darstellt, ob oder nicht diesen Dateityp in das Ausgabeverzeichnis kopiert werden.

Diese Hunderte von Zeilen erstellen Upload/Download Batch-Dateien mit Tausenden von XCOPY-Zeilen. In unseren Setup-Projekten können wir Dinge wie „Primäre Ausgabe von Client“ und „Content Dateien von Client“ verweisen. Ich würde gerne in der Lage sein, dass von einem nicht-Setup-Projekt programmatisch zu tun, aber ich bin ratlos.

Offensichtlich MS tut es, entweder mit einer API oder durch Parsen der .csproj-Dateien. Wie würde ich das machen? Ich bin nur nach einer Möglichkeit, eine Liste von Dateien für alle Setup-Kategorien zu erhalten, das heißt:

  • Primary Output
  • Lokalisierte Ressourcen
  • Inhaltsdateien
  • Dokumentationsdateien

BEARBEITEN: Ich habe ein Setup-Projekt wie Hath vorgeschlagen, und es ist auf halbem Weg zu dem, was ich suche. Das einzige Problem, dass die Beibehaltung von einer perfekten Lösung ist, dass mehrere Projekte hängen von den gleichen Baugruppen in einem eigenen Ordner zu sein, und das Setup wird die Datei nur einmal kopieren.

Beispiel:

Projekte Admin, Client und Server alle auf ExceptionHandler.dll verlassen, und Admin und Kunde sowohl auf Util.dll verlassen, während Server nicht der Fall ist. Dies ist, was ich suche:

  • Admin
    • Admin.exe
    • Admin.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Client
    • Client.exe
    • Client.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Server
    • Server.exe
    • Server.exe.config
    • ExceptionHandler.dll

Da die referenzierten Assemblys sind alle gleich, was ich bekommen, ist dies:

  • Admin
    • Admin.exe
    • Admin.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Kunde
    • Client.exe
    • Client.exe.config
  • Server
    • Server.exe
    • Server.exe.config

Dies führt zu einer FileNotFoundException, wenn entweder Client oder Server nicht einer der beiden DLLs finden es erwartet.

Gibt es eine Setup-Eigenschaft I fehlen bin es immer die Ausgabe machen kopieren, auch wenn es an anderer Stelle des in einem anderen Projekt Ausgang dupliziert wird?

BEARBEITEN WIEDER: Alle referenzierten DLLs sind auf "Copy Local" gesetzt und wurden schon immer verwendet. Ich fand einen anständigen Artikel auf using NAnt and XSLT to grab the list of files, so dass eine mögliche Lösung auch sein mag, wie neouser99 vorgeschlagen.

AKZEPTIERTE LÖSUNG: Ich bin ziemlich genau dort, wo ich angefangen habe. Alle .EXE- und .DLL-Ausgaben werden im Setup-Projekt lose in ein "bin" -Verzeichnis abgelegt. Die anderen Ordner pro Anwendung enthalten Verknüpfungen zu der ausführbaren Datei in diesem Verzeichnis.

Der Unterschied besteht jetzt darin, dem Installer eine benutzerdefinierte Aktion hinzuzufügen, Reflektion zu verwenden, die Abhängigkeiten für jede ausführbare Ausgabe aufzuzählen und die EXE- und DLL-Dateien in die separaten Verzeichnisse zu kopieren. Wenig Schmerzen, wie ich war nur angenommen, es eine Möglichkeit, programmatisch zu erkennen, welche Dateien würden über einige Setup-Bibliothek aufgenommen werden.

Nochmals vielen Dank für die Hilfe.

Antwort

1

warum nicht ein anderes Setup-Projekt verwenden und nur die ‚Paketdateien‘ Einstellung als lose unkomprimierte Dateien (Setup-Ausbau-> Eigenschaften) eingestellt? dann teilen Sie den Ordner .. oder etwas.

edit:

ich sehe, haben Sie 3 Ordner für die Ausgänge. aber das Setup-Projekt erkennt nur die ExceptionHandler.dll und Util.dll einmal, so dass es nur den ersten Ordner auswählen und dort einlegen wird.

Sie könnten ein Setup-Projekt für jedes Projekt tun - etwas ärgerlich vielleicht ..

Sie manuell in dem DLL zu den Projekten hinzufügen könnte, dass die Assembly fehlen entweder in der Datei des Hinzufügen von ‚Datei hinzufügen‘ oder "Add Assembly" oder "Add Project Output", wenn Sie diese Projekte in der gleichen Lösung haben. (Ich bezweifle jedoch, dass das der Fall ist).

oder Dump alle von ihnen in ein Ausgabeverzeichnis ...

+0

Es funktioniert teilweise. Ich habe die Frage mit dem Problem aktualisiert, auf das ich gerade gestoßen bin. –

1

Obwohl es als Build-Tool entwickelt hat, könnten Sie NAnt finden extrem nützlich zu sein in dem, was Sie reden. Die Aufgaben (Erstellen, Kopieren, Verschieben, Löschen usw.), die Sie definieren können, ermöglichen sehr feingranulare Dateisuchen, bis hin zu allgemeinen, vollständigen Ordnern. Wenn Sie auch NAnt in Ihren Build-Prozess einbeziehen, denke ich, dass Sie herausfinden könnten, dass es in mehr als einer Hinsicht hilft.

+0

Haben Sie Referenzen oder Beispiele dafür, wie Sie die Inhaltsdateien oder die Projektausgabe gezielt erhalten? Ich habe einen anständigen Artikel darüber gefunden, den ich dem ursprünglichen Beitrag hinzugefügt habe. –

1

Ein weiterer Ansatz, der für mich in der Vergangenheit gearbeitet hat, ist die gemeinsam genutzte Ressource (Assembly, DLL oder Projekt) als Verweis auf jede der Admin, Server und Client-Projekten hinzuzufügen. Öffnen Sie dann das Eigenschaftsfenster für das referenzierte Element in jedem Projekt und setzen Sie "Copy Local" auf "true".

Nun, wenn Sie die Projekte, bei denen jeweils seine eigene Instanz der Assembly in seine Ausgabeordner kopiert haben.

verursacht Dies sollte auch die gemeinsam genutzten Komponenten in dieser Weise aufgenommen in jedem der Ausgang Ordner in dem Setup-Paket repliziert werden.

+0

Alle sind auf "Copy Local" eingestellt, so wie unsere aktuelle XCOPY-Lösung funktioniert. Leider erkennt das Setup-Projekt eine gemeinsame Abhängigkeit als bereits vorhanden, so dass es nicht in einen zweiten Ordner kopiert wird. –

0

Ein völlig anderer Ansatz könnte sein, sich als symbolische Links auf der Netzwerkfreigabe einzurichten. Ein symbolischer Link ist im Grunde eine Abkürzung wo die Datei-System die Tatsache versteckt, dass es eine Abkürzung ist, so dass alle anderen Anwendungen glaubt tatsächlich, dass die Datei (http://en.wikipedia.org/wiki/NTFS_symbolic_link) kopiert wurde.

Ein Vorteil dieses Ansatzes besteht darin, dass die Datei sofort als die Dateiänderungen aktualisiert wird, und nicht nur, wenn Sie Ihre Projekte bauen. Wenn Sie zum Beispiel eine der Konfigurationsdateien mit einem Texteditor speichern, wird das Update sofort angewendet.

0

Der folgende MSBuild-Skriptteil kann Ihre SLN-Datei erstellen (Sie können sie durch .csproj ersetzen) und eine Liste aller Projekte erstellen, die erstellt wurden (Dlls, EXEs).

<MSBuild Projects="MySolution.sln" Targets="Clean; Rebuild" Properties="Configuration=$(BuildMode);"> 
    <Output TaskParameter="TargetOutputs" 
       ItemName="AssembliesBuilt" /> 
    </MSBuild> 

Nun, dies löst nicht wirklich dein Problem, aber es wird Ihnen eine Liste von allem, was zu bauen war. Sie haben auch copylocal, so dass Sie wahrscheinlich AssembiesBuild verwenden und alle DLL- und .CONFIG-Dateien von dort kopieren können.

Beispiel:

AssembliesBuild = c: \ myproj \ something1 \ build.dll

Sie c gehen würde: \ myproj \ something1 \ und einfach für alle suchen * .dll und * .config Dateien und enthalten sie. Sie können dies ziemlich einfach mit MSBuild oder Powershell tun, wenn Sie es installiert haben. Um ein XCOPY-Skript von MSBuild auszugeben, muss MSBuild contrib project installiert sein.

Verwandte Themen