服務清單文件被作爲構建的一部分自動填充了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>
放置約束是服務清單的一部分。你需要在應用程序清單中編輯什麼? –
我不知道我知道如何回答@MattThalman :)我沒有意識到PlacementConstraints出現在ServiceManifest.xml文件中(仍然有很多)。所以我相信我的問題應該是詢問ServiceManifest而不是ApplicationManifest。但是,當我將它們添加到項目的ServiceManifest中時,構建不會將它們包含在ApplicationManifest中。 –
不在應用清單中包含_what_?放置限制?他們不應該在應用程序清單中。我不確定我是否明白問題所在。 –