2016-04-21 74 views
1

當我添加一個新的演員,以我的服務Fabric項目,該服務自動,因爲我們有UpdateServiceFabricManifestEnabled設置爲true添加到我的ApplicationManifest.xmlServiceManifest.xml文件。對於某些項目,我們需要服務具有PlacementConstraints,以便將它們部署到適當的節點。如何自定義我的服務清單文件的創建?

如何掛鉤到此過程中,以便我可以指定PlacementConstraints而不必記住編輯任何清單文件?

+0

放置約束是服務清單的一部分。你需要在應用程序清單中編輯什麼? –

+0

我不知道我知道如何回答@MattThalman :)我沒有意識到PlacementConstraints出現在ServiceManifest.xml文件中(仍然有很多)。所以我相信我的問題應該是詢問ServiceManifest而不是ApplicationManifest。但是,當我將它們添加到項目的ServiceManifest中時,構建不會將它們包含在ApplicationManifest中。 –

+0

不在應用清單中包含_what_?放置限制?他們不應該在應用程序清單中。我不確定我是否明白問題所在。 –

回答

1

服務清單文件被作爲構建的一部分自動填充了actor參數類型。有一個MSBuild目標在內置的「Build」目標之後運行,它執行此操作。你可以使用你自己的邏輯,在這之後運行。在該邏輯中,您可以對服務清單文件進行任何必要的更改。以下示例確保將放置約束添加到服務清單文件中的所有服務類型。它使用內聯的MSBuild任務,但您可以將其重寫爲包含在已編譯的程序集或任何您想要執行的任務中。

該樣品應放置在你的演員的服務項目中的文件的末尾:

<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> 
相關問題