【问题标题】:How can I customize the creation of my Service Manifest file?如何自定义我的服务清单文件的创建?
【发布时间】:2016-08-13 22:50:37
【问题描述】:

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

如何加入此过程,以便我可以指定 PlacementConstraints 而无需记住编辑任何清单文件?

【问题讨论】:

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

标签: azure-service-fabric


【解决方案1】:

作为构建的一部分,服务清单文件会自动填充参与者服务类型。有一个 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>

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 2015-01-22
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多