Azure service fabric 如何自定义服务清单文件的创建?

Azure service fabric 如何自定义服务清单文件的创建?,azure-service-fabric,Azure Service Fabric,当我向我的Service Fabric项目中添加新参与者时,该服务会自动添加到我的ApplicationManifest.xml和ServiceManifest.xml文件中,因为我们已将UpdateServiceFabricManifestEnabled设置为true。对于某些项目,我们需要要求服务具有PlacementConstraints,以便将它们部署到适当的节点 如何连接到这个过程中,以便在不必记得编辑任何清单文件的情况下指定放置约束?作为构建的一部分,服务清单文件将自动填充参与者服务

当我向我的Service Fabric项目中添加新参与者时,该服务会自动添加到我的ApplicationManifest.xmlServiceManifest.xml文件中,因为我们已将UpdateServiceFabricManifestEnabled设置为true。对于某些项目,我们需要要求服务具有PlacementConstraints,以便将它们部署到适当的节点


如何连接到这个过程中,以便在不必记得编辑任何清单文件的情况下指定放置约束?

作为构建的一部分,服务清单文件将自动填充参与者服务类型。有一个MSBuild目标在执行此操作的内置“Build”目标之后运行。你可以附加你自己的逻辑,在这之后运行。在该逻辑中,您可以对服务清单文件进行任何必要的更改。下面的示例确保将放置约束添加到服务清单文件中的所有服务类型。它使用内联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>


serviceTypes=serviceManifest.Root.Element(XName.Get(“serviceTypes”,FabricNamespace)).Elements();
bool changesMade=false;
foreach(serviceTypes中的XElement serviceType)
{
XName placementConstraintsName=XName.Get(“PlacementConstraints”,FabricNamespace);
if(serviceType.Element(placementConstraintsName)==null)
{
XElement placementConstraints=新XElement(placementConstraintsName);
placementConstraints.Value=“(在此处添加您的约束)”;
serviceType.AddFirst(placementConstraints);
changesMade=true;
}
}
if(changesMade)
{
保存(ServiceManifestPath);
}
]]>


放置约束是服务清单的一部分。你需要在应用程序清单中编辑什么?我不确定我是否知道如何回答@MattThalman:)我没有意识到PlacementConstraints在serviceMifest.xml文件中(仍在学习)。所以我认为我的问题应该是询问ServiceManifest而不是ApplicationManifest。但是,当我将它们添加到项目的ServiceManifest中时,构建不会在ApplicationManifest中包含它们。不会在应用程序清单中包含什么?布局约束?它们不应该出现在应用程序清单中。我不确定我是否理解问题所在。也许更好的问题是:当我部署时,我需要添加PlacementConstraints。我找不到太多关于我们应该如何做这件事的文档。所以,您希望将放置约束作为构建过程的一部分自动添加到您的服务清单中吗?