2016-04-21 6 views
1

Wenn ich einen neuen Darsteller zu meinem Dienst Fabric Projekt hinzufügen, wird der Dienst auf meine ApplicationManifest.xml und ServiceManifest.xml Dateien automatisch hinzugefügt, da wir UpdateServiceFabricManifestEnabled Satz wahr haben. Für bestimmte Projekte müssen wir Dienste benötigen, die PlacementConstraints haben, damit sie auf dem richtigen Knoten bereitgestellt werden.Wie kann ich die Erstellung meiner Service Manifest-Datei anpassen?

Wie hänge ich in diesen Prozess ein, damit ich die PlacementConstraints angeben kann, ohne sich daran zu erinnern, die Manifestdateien zu bearbeiten?

+0

Platzierungsbedingungen sind Bestandteil des -Servicemanifest:

Diese Probe sollte in Ihrem Darsteller Service-Projekt am Ende der Datei platziert werden. Was müssen Sie im Anwendungsmanifest bearbeiten? –

+0

Ich bin mir nicht sicher, ob ich weiß, wie man @MattThalman beantwortet :) Ich habe nicht bemerkt, dass PlacementConstraints in der Datei ServiceManifest.xml enthalten sind (immer noch viel lernen). Also glaube ich, dass meine Frage nach ServiceManifest statt nach ApplicationManifest fragen sollte. Wenn ich sie jedoch im ServiceManifest des Projekts hinzufüge, werden sie vom Build nicht in ApplicationManifest eingeschlossen. –

+0

Enthält _what_ im App-Manifest nicht? Die Platzierungsbeschränkungen? Sie sollten nicht im App-Manifest enthalten sein. Ich bin mir nicht sicher, ob ich verstehe, wo das Problem liegt. –

Antwort

1

Die Dienstmanifestdatei wird automatisch mit den Akteurservicetypen als Teil des Builds gefüllt. Es gibt ein MSBuild-Ziel, das nach dem eingebauten "Build" -Ziel ausgeführt wird, das dies tut. Sie können Ihre eigene Logik anheften, die danach ausgeführt wird. In dieser Logik können Sie alle erforderlichen Änderungen an der Dienstmanifestdatei vornehmen. Im folgenden Beispiel wird sichergestellt, dass Platzierungseinschränkungen allen Diensttypen in der Dienstmanifestdatei hinzugefügt werden. Es verwendet eine Inline-MSBuild-Aufgabe, aber Sie könnten dies neu schreiben, um in einer kompilierten Assembly enthalten zu sein oder was auch immer Sie tun möchten.

<UsingTask TaskName="EnsurePlacementConstraints" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll"> 
    <ParameterGroup> 
    <ServiceManifestPath ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 
    <Task> 
    <Reference Include="System.Xml" /> 
    <Reference Include="System.Xml.Linq" /> 
    <Using Namespace="System.Xml.Linq" /> 
    <Code Type="Fragment" Language="cs"> 
    <![CDATA[ 
const string FabricNamespace = "http://schemas.microsoft.com/2011/01/fabric"; 
XDocument serviceManifest = XDocument.Load(ServiceManifestPath); 
IEnumerable<XElement> serviceTypes = serviceManifest.Root.Element(XName.Get("ServiceTypes", FabricNamespace)).Elements(); 
bool changesMade = false; 
foreach (XElement serviceType in serviceTypes) 
{ 
    XName placementConstraintsName = XName.Get("PlacementConstraints", FabricNamespace); 
    if (serviceType.Element(placementConstraintsName) == null) 
    { 
    XElement placementConstraints = new XElement(placementConstraintsName); 
    placementConstraints.Value = "(add your contraints here)"; 
    serviceType.AddFirst(placementConstraints); 
    changesMade = true; 
    } 
} 

if (changesMade) 
{ 
    serviceManifest.Save(ServiceManifestPath); 
} 
    ]]> 
    </Code> 
    </Task> 
</UsingTask> 

<Target Name="EnsurePlacementConstraints" AfterTargets="Build"> 
    <EnsurePlacementConstraints ServiceManifestPath="$(MSBuildThisFileDirectory)\PackageRoot\ServiceManifest.xml" /> 
</Target> 
Verwandte Themen