Local.xml 以外的 Service Fabric 默认发布配置文件

Service Fabric Default Publish Profile other than Local.xml

我们公司正在使用 Service Fabric 开发我们的新应用程序。 我们遇到的一个常见问题是,多个开发人员使用远程服务器上的队列、数据库、存储,每个都有不同的配置,所有设置都存储在每个环境的 ApplicationParameters 文件中,对于本地开发,只有一个 Local.5Node.xml。当我们获得这些文件的最新版本时,开发人员检查他们的凭据并覆盖其他人是很常见的。

我正在尝试自定义 ServiceFabric 部署脚本 'Deploy-FabricApplication.ps1' 以根据登录用户的 windows 凭据使用自定义 PublishProfile。我可以实现更新部署文件,当我们使用发布进行部署时效果很好,但是当我们点击 F5(调试)时 ServiceFabric 的默认行为似乎是用特定的 Local.5Node.xml 应用程序覆盖参数参数.

我探索了所有服务结构 .ps1 文件,但找不到它的定义位置。我想这是在 .targets 文件中定义的,所以我不知道如何避免这种默认行为。

是否有任何其他方法可以在 Local 以外的本地开发机器上使用自定义 PublishProfiles。5Node.xml?

当我们使用 Visual Studio 调试解决方案时,Service Fabric 的 VS 扩展定义了一个硬编码的发布配置文件,它检查我的集群有多少节点并创建一个 link 到本地。5Node.xml 和本地。1Node.xml 取决于我的集群有多少节点。

为了实现相同的结果,我们最终使用每个开发人员的自定义应用程序参数,并且每个开发人员更新发布配置文件(本地。5node.xml)以指向他们各自的应用程序参数文件。

它不是必需的自动化功能,但可以解决主要问题。

我实际上只是 运行 通过设置一些特定于团队的环境来参与其中。我从以下来源借用了信息:

我根据不同团队的需要添加了多个参数文件。每一个都包含其特定的资源设置。

我还添加了 Local.1Node.Template.xml 和 Local.5Node.Template.xml。我什至从源代码管理中删除了 Local.1Node.xml 和 Local.5Node.xml 并将它们设置为忽略,同时将它们留在项目中,这样 Visual Studio 就不会认为它们真的丢失了. 1Node(5Node除了把1Node换成5Node外其他都一样)内容如下:

<?xml version="1.0" encoding="utf-8"?>
<PublishProfile xmlns="http://schemas.microsoft.com/2015/05/fabrictools">
    <ClusterConnectionParameters />
    <ApplicationParameterFile Path="..\ApplicationParameters\Local.1Node.$(Configuration).xml" />
</PublishProfile>

然后我编辑了 Service Fabric 项目的 sfproj 文件以包含以下 MSBuild 任务和目标:

<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <InputFilename ParameterType="System.String" Required="true" />
        <OutputFilename ParameterType="System.String" Required="true" />
        <MatchExpression ParameterType="System.String" Required="true" />
        <ReplacementText ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Reference Include="System.Core" />
        <Using Namespace="System" />
        <Using Namespace="System.IO" />
        <Using Namespace="System.Text.RegularExpressions" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
                File.WriteAllText(
                    OutputFilename,
                    Regex.Replace(File.ReadAllText(InputFilename), MatchExpression, ReplacementText)
                );
            ]]>
        </Code>
    </Task>
</UsingTask>
<Target Name="UpdateProfile" BeforeTargets="UpdateServiceFabricApplicationManifest">
    <ReplaceFileText InputFilename="PublishProfiles\Local.1Node.Template.xml" OutputFilename="PublishProfiles\Local.1Node.xml" MatchExpression="$\(Configuration\)" ReplacementText="$(Configuration)" />
    <ReplaceFileText InputFilename="PublishProfiles\Local.5Node.Template.xml" OutputFilename="PublishProfiles\Local.5Node.xml" MatchExpression="$\(Configuration\)" ReplacementText="$(Configuration)" />
</Target>

最后一步是为团队设置不同的构建配置。我根据Service Fabric Service项目和Service Fabric Host项目中的Debug配置创建了FT1-Debug到FT6-Debug。我把所有其他项目都搁置了。

此时,不同团队中的每个人都可以使用他们正在工作的集群的正确配置进行本地调试,只需更改构建配置并按 F5 进行调试即可。