2016-01-17 9 views
5

Ich habe eine ASP.NET-Webanwendung, die aus mehreren ASP.NET-Projekten (zusätzlich zu mehreren Klassenbibliotheken) besteht. Offensichtlich ist eines der Projekte das Root-Projekt, während der Rest Teilprojekte sind (das detaillierte Konzept dieser Anwendungsstruktur wird erklärt here). Jedes der Sub-/Child-Projekte hat sein eigenes Verzeichnis und alle sitzen in einem Verzeichnis, das ich "Module" im Stammordner genannt habe. Da IIS mit einem Projekt pro Anwendung umgehen kann, werden alle untergeordneten Projekte als reguläre Verzeichnisse (beim Ausführen) behandelt. Daher habe ich den Build-Ausgabepfad für jedes der untergeordneten Projekte in "..\..\bin\" geändert, was der Stammordner ist. So habe ich alles richtig eingerichtet. Aus Sicht von Visual Studio habe ich den Luxus, verschiedene Projekte unter einer Lösung zu haben. Und aus der IIS-Perspektive habe ich ein Projekt mit einen bin-Ordner und eine Web.Config-Datei. Jetzt kommt es zur Veröffentlichung. Wenn ich das Root-Projekt veröffentliche (indem ich mit der rechten Maustaste auf den Projektknoten klicke -> publish), wird die veröffentlichte Ausgabe dieses Projekt nur ohne den Ordner "Modules" sein. Der resultierende bin-Ordner wird auch die Ausgabe-DLLs der Subprojekte vermissen. Und das wird erwartet. Also dachte ich, dass der offensichtliche Weg, dies zu beheben, darin besteht, alle meine Webprojekte (nicht nur den root) zu veröffentlichen, wobei ich bedenken muss, dass mein Pfad für die Veröffentlichung von Subprojekten der Ordner "Module" im Publishpfad des Rootprojekts sein muss. All das funktionierte großartig, abgesehen von einem wesentlichen Problem. Es stellte sich heraus, dass jedes der veröffentlichten Subprojekte seinen eigenen bin-Ordner hat und folglich der Ordner des Root-Ordners nicht die Output-DLLs der Unterprojekte enthält. Also dachte ich mir, während Visual Studio mir erlaubt, den Ausgabepfad jedes Projekts so zu spezifizieren, wie ich es möchte (wie ich erwähnt habe, setze ich es auf "..\..\bin\"), die ClickOnce Veröffentlichung respektiert das nicht und erstellt einfach einen bin Ordner für jedes Unterprojekt . Gibt es eine Möglichkeit, den Ausgabepfad (den bin-Ordner) der ClickOnce-Veröffentlichung anzugeben? Wenn nicht, was wäre eine alternative Lösung?Veröffentlichen von Webanwendung mit mehreren Projekten

Antwort

1

Wie Sie sagten, Sie haben mehrere projects und man ist das Root-Projekt. So sollte jedes Projekt seinen eigenen bin Ordner haben, weil es ein project kein sub folder von root project ist.

Wenn sub project würde keine bin Ordner haben, wie es wissen würde, von wo aus assemblies zu laden, die in diesen project verwendet werden.

Es ist keine schlechte Idee, bin Ordner für jedes Sub project zu haben.

+0

Von dem Link ich in der Frage enthalten. Bitte überprüfe diesen Teil hoffentlich, damit mein Fall klarer wird. 'Nachdem Sie die untergeordneten Projekte so konfiguriert haben, dass sie ein gemeinsames Stammverzeichnis der IIS-Anwendung freigeben, können Sie Ressourcen zwischen Projekten in der Lösung freigeben. Sie können z. B. ein Benutzersteuerelement aus einem freigegebenen Ressourcenprojekt in eine ASPX-Datei in einem anderen Projekt ziehen. Beachten Sie, dass dies nur möglich ist, nachdem Sie die Projekte so konfiguriert haben, dass sie einen gemeinsamen IIS-Anwendungsstamm freigeben. Visual StudioNET ermöglicht es Ihnen nicht, Ressourcen zu teilen, wenn sich die Projekte noch in separaten Stammverzeichnissen der IIS-Anwendung befinden. – yazanpro

+0

Aus IIS-Sicht habe ich also nur ein Projekt. Und technisch würden die untergeordneten Projekte ihre Assemblys aus dem Root-Bin-Ordner laden (ich setze explizit den Ausgabepfad aller meiner untergeordneten Projekte auf '.. \ .. \ bin', was der Root-Bin-Ordner ist.) – yazanpro

1

Die Antwort here kann Ihr Problem beheben. Durch das Hinzufügen der folgenden Attribute zu Ihrer .csproj-Datei (aus verknüpften Antwort geändert), können Sie Clickonce, um zusätzliche Inhalte im Ausgabeverzeichnis informieren:

<ItemGroup> 
    <Content Include="bin\**\*.*" /> 
</ItemGroup> 

Eine andere Antwort here bietet eine Möglichkeit gegeben rekursiv umfassen zusätzliche Inhalte in Ihre die Ausgabe des Projekts, die sich außerhalb Ihres Projektordners befindet, was hier gelten kann; Aus der Perspektive des Root-Projekts befinden sich die anderen Projekte außerhalb des Ordners. Ich bin mir jedoch nicht sicher, ob ClickOnce dies ignoriert oder nicht.

<Content Include="..\..\MyContentFiles\**"> 
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 
+0

Ich habe keine Chance, Ihre Lösung noch zu testen, aber ich glaube, es ist hilfreich. Ich werde als Antwort markieren, wenn sie funktioniert. Danke, – yazanpro

Verwandte Themen