c# - 如何在构建/部署时忽略 servicefabric list 文件中的服务类型

标签 c# azure-service-fabric

我正在使用服务结构,并且有一个包含两个参与者和一个服务的包,并且在构建时我的应用程序的 list 文件会自动更新为:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MessageProcessor.ServiceFabricHostType" ApplicationTypeVersion="1.0.2" xmlns="http://schemas.microsoft.com/2011/01/fabric">
   <Parameters>
      <Parameter Name="QueueListenerActorService_PartitionCount" DefaultValue="10" />
      <Parameter Name="QueueManagerActorService_PartitionCount" DefaultValue="10" />
      <Parameter Name="QueueManagerActorService_MinReplicaSetSize" DefaultValue="2" />
      <Parameter Name="QueueManagerActorService_TargetReplicaSetSize" DefaultValue="3" />
      <Parameter Name="ManagementApiService_InstanceCount" DefaultValue="-1" />
   </Parameters>
   <ServiceManifestImport>
      <ServiceManifestRef ServiceManifestName="ServiceFabricPkg" ServiceManifestVersion="1.0.2" />
   </ServiceManifestImport>
   <DefaultServices>
      <Service Name="QueueManagerActorService" GeneratedIdRef="1fbd648e-7780-4ddb-869e-9bc965f0d15f">
         <StatefulService ServiceTypeName="QueueManagerActorServiceType" TargetReplicaSetSize="[QueueManagerActorService_TargetReplicaSetSize]" MinReplicaSetSize="[QueueManagerActorService_MinReplicaSetSize]">
            <UniformInt64Partition PartitionCount="[QueueManagerActorService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
         </StatefulService>
      </Service>
      <Service Name="ManagementApiService">
         <StatelessService ServiceTypeName="ManagementApiServiceType" InstanceCount="[ManagementApiService_InstanceCount]">
            <SingletonPartition />
         </StatelessService>
      </Service>
      <Service Name="QueueListenerActorService" GeneratedIdRef="06c6a81c-fbb7-4938-97b5-15e76888363c">
         <StatelessService ServiceTypeName="QueueListenerActorServiceType">
            <UniformInt64Partition PartitionCount="[QueueListenerActorService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
         </StatelessService>
      </Service>
   </DefaultServices>
</ApplicationManifest>

但我希望它不要部署QueueListenerActorService,因为我稍后会在应用程序代码中使用部署时未知的一些放置约束来设置它。

`

    var fabricClient = new FabricClient();
    var services = await fabricClient.QueryManager.GetServiceListAsync(new Uri("fabric:/MessageProcessor.ServiceFabricHost"), new Uri("fabric:/MessageProcessor.ServiceFabricHost/QueueListenerActorService"));
    await fabricClient.ServiceManager.CreateServiceAsync(new StatelessServiceDescription
    {
        ServiceTypeName = "QueueListenerActorServiceType",
        ServiceName = serviceUri,
        PartitionSchemeDescription = new UniformInt64RangePartitionSchemeDescription { PartitionCount = 2, LowKey = Int64.MinValue, HighKey = Int64.MaxValue },
        InstanceCount = 1,
        PlacementConstraints = "NodeType == something",
        ApplicationName = new Uri("fabric:/MessageProcessor.ServiceFabricHost"),
    });

如果我从 list 文件中删除它,那么它会在构建时再次生成

最佳答案

事实证明,作为 Actor Nuget 包的一部分,包含一个构建脚本,可以使用工具 FabActUtil.exe 自动生成和更新服务和应用程序 list 。

通过更改包含参与者的项目的项目文件 .csproj 并设置属性。

<UpdateServiceFabricManifestEnabled>false</UpdateServiceFabricManifestEnabled>

可以禁用该工具。

然后我可以注释掉我想忽略的服务。

使用 grunt 更新

因此,由于 grunt 几乎是 Visual Studio 中的第一手公民,我决定使用它来实现自动化。禁用上述属性的问题在于,卸载项目以使其能够在添加新参与者时生成新 list 是很烦人的。现在我有一个繁重的任务,这使得它变得更加容易。

gruntfile.js

module.exports = function (grunt) {
    'use strict';
    grunt.loadNpmTasks('grunt-exec');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-xmlstoke');

    grunt.registerTask("FabActUtil", ["copy:FabActUtilBackup", "copy:FabActUtil", "exec:FabActUtil","xmlstoke:FabActUtil","clean:FabActUtil"]);

    var relativePackageDir = "../../packages/";
    var buildDir = "bin/x64/Debug/";
    var temp = "artifacts"
    var assemblyName = "S-Innovations.Azure.MessageProcessor.ServiceFabric.exe";
    var relativeAppDir = "../MessageProcessor.ServiceFabricHost/";
    var appManifest = relativeAppDir + 'ApplicationPackageRoot/ApplicationManifest.xml';

    grunt.initConfig({
        copy:{
            FabActUtil:{
                src: relativePackageDir + "Microsoft.ServiceFabric.Actors*/build/FabActUtil.exe",
                dest: buildDir+"FabActUtil.exe"
            },
            FabActUtilBackup:{
                src:appManifest,
                dest: appManifest+".bac"
            }
        },
        clean:{
            FabActUtil: ["bin/x64/Debug/FabActUtil.exe"],
        },
        exec: {
            // Run tsd link to add bower/npm packages typescript definition files.
            "FabActUtil": {
                cmd: 'bin\\x64\\Debug\\FabActUtil.exe /app:' + relativeAppDir.replace(new RegExp('/', 'g'), "\\") + '\\ApplicationPackageRoot /out:' + temp.replace(new RegExp('/', 'g'), "\\") + ' /spp:PackageRoot /in:' +buildDir.replace(new RegExp('/', 'g'),"\\")+ assemblyName,
            }
        },
        xmlstoke: {
            FabActUtil: {
                options: {
                    actions: [{
                        xpath: '//DefaultServices/Service[@Name="QueueListenerActorService"]',
                        type: 'D'
                    }],
                },
                files: { appManifest: appManifest },
            },
        },
    })
}

添加package.json时,vs中自动安装以下软件包

package.json

{
  "name": "sf",
  "version": "1.0.0",
  "dependencies": { },
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-exec": "^0.4.6",
    "grunt-contrib-copy": "1.0.0",
    "grunt-contrib-clean": "1.0.0",
    "grunt-xmlstoke": "0.7.1"
  }
}

请注意,要使用这个必须修复路径。

关于c# - 如何在构建/部署时忽略 servicefabric list 文件中的服务类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35820191/

相关文章:

C# Winform 带像素化的图像缩放

azure - 连夜关闭 ServiceFabric 集群

docker - 在服务结构中参数化正在运行的docker镜像

C# - 命名设计模式

c# - NAudio使用WaveMixerStream32()将2个两个音频混合在一起->如何让第二个音频稍后开始

c# - DateTime.Kind 未在 WCF 中返回

c# - 更改类对象列表中项目值的正确方法

azure-service-fabric - 如何设置和配置服务结构集群?

适用于 Service Fabric 的 Azure 应用程序见解

c# - 如何从 C# 执行 Service Fabric Powershell 命令?