如何自定义我的服务清单文件的创建?
How can I customize the creation of my Service Manifest file?
当我将新的 Actor 添加到我的 Service Fabric 项目时,该服务会自动添加到我的 ApplicationManifest.xml 和 ServiceManifest.xml 个文件,因为我们已将 UpdateServiceFabricManifestEnabled 设置为 true。对于某些项目,我们需要要求服务具有 PlacementConstraints,以便将它们部署到正确的节点。
我如何连接到这个过程,以便我可以指定 PlacementConstraints 而不必记得编辑任何清单文件?
作为构建的一部分,服务清单文件会自动填充参与者服务类型。在执行此操作的内置 "Build" 目标之后,有一个 MSBuild 目标获得 运行。在此之后,您可以根据自己的逻辑获得 运行。在该逻辑中,您可以对服务清单文件进行任何必要的更改。下面是一个确保将放置约束添加到服务清单文件中的所有服务类型的示例。它使用内联 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>
当我将新的 Actor 添加到我的 Service Fabric 项目时,该服务会自动添加到我的 ApplicationManifest.xml 和 ServiceManifest.xml 个文件,因为我们已将 UpdateServiceFabricManifestEnabled 设置为 true。对于某些项目,我们需要要求服务具有 PlacementConstraints,以便将它们部署到正确的节点。
我如何连接到这个过程,以便我可以指定 PlacementConstraints 而不必记得编辑任何清单文件?
作为构建的一部分,服务清单文件会自动填充参与者服务类型。在执行此操作的内置 "Build" 目标之后,有一个 MSBuild 目标获得 运行。在此之后,您可以根据自己的逻辑获得 运行。在该逻辑中,您可以对服务清单文件进行任何必要的更改。下面是一个确保将放置约束添加到服务清单文件中的所有服务类型的示例。它使用内联 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>