当我向 Service Fabric 项目添加新 Actor 时,该服务会自动添加到我的 ApplicationManifest.xml 和 ServiceManifest.xml 文件中,因为我们有 UpdateServiceFabricManifestEnabled 设置为 true。对于某些项目,我们需要要求服务具有PlacementConstraints,以便将它们部署到正确的节点。
如何 Hook 此流程,以便可以指定 PlacementConstraints,而无需记住编辑任何 list 文件?
最佳答案
作为构建的一部分,服务 list 文件会自动填充参与者服务类型。有一个 MSBuild 目标在执行此操作的内置“Build”目标之后运行。您可以添加在此之后运行的自己的逻辑。在该逻辑中,您可以对服务 list 文件进行任何必要的更改。下面的示例确保将放置约束添加到服务 list 文件中的所有服务类型。它使用内联 MSBuild 任务,但您可以将其重写以包含在已编译的程序集中或您想要执行的任何操作中。
此示例应放置在您的 Actor 服务项目中的文件末尾:
<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>
关于azure-service-fabric - 如何自定义服务 list 文件的创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757692/