除了Local.xml,Service Fabric有哪些默认的发布配置文件?

3
我们公司正在使用Service Fabric开发新应用程序。
一个常见问题是,多个开发人员使用位于远程服务器上的队列、数据库和存储,并且每个开发人员都有不同的配置。所有设置都存储在每个环境的ApplicationParameters文件中。对于本地开发,有一个单独的Local.5Node.xml文件。很常见的情况是,开发人员会检查他们的凭据并覆盖其他人的凭据,当我们获取这些文件的最新版本时。
我试图自定义ServiceFabric部署脚本'Deploy-FabricApplication.ps1',根据已登录用户的Windows凭据使用自定义PublishProfile。我可以通过更新部署文件来实现这一点,在使用发布时它能够正常工作,但似乎当我们按F5(调试)时,ServiceFabric的默认行为是使用特定的Local.5Node.xml应用程序参数覆盖参数。
我探索了所有Service Fabric .ps1文件,但找不到这是在哪里定义的。我猜这是在.targets文件中定义的,所以我不知道如何避免这种默认行为。
除了Local.5Node.xml之外,是否有任何其他方法在本地开发机器上使用自定义PublishProfiles?

你有考虑为开发阶段创建一个默认凭据吗?这样每个人都可以共享开发阶段的同一凭据,从而避免此类配置问题。 - Fals
为什么要将设置存储在ApplicationParameters文件中而不是app.config中?顺便说一下,第二个选项可以通过转换轻松配置多个开发人员。 - cassandrad
没有办法为所有开发者使用单一配置,一个非常普遍的例子是,我们的系统将消息放入队列,而其他服务则会获取这些消息。如果有多个开发者正在运行应用程序,则他们将从其他人那里获取消息,而所有者开发者将无法收到这些消息。我们使用ApplicationParameters,因为我们的服务完全基于Service Fabric,它的工作非常好,我们不想在ApplicationParameters和AppConfigs之间分割配置。 - Diego Mendes
今天它已经可以使用每个开发人员的AppParam文件工作了,但问题是,只有在使用发布命令时才能工作,按F5键时无法工作,我认为这是因为.targets硬编码始终使用Local.5Node.xml或Local.1Node.xml。 - Diego Mendes
1
不是目标文件被硬编码,而是用于Service Fabric工具的VS扩展中硬编码了此逻辑。目前没有办法修改这种行为。因此,除了让每个开发人员手动更新参数(或通过自己的定制自动化)以便在需要时设置它们之外,没有很好的解决方案来实现您想要的。 - Matt Thalman
2个回答

10

我最近在为一些团队设置特定的环境时遇到了这个问题。我从以下来源借鉴了信息:

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

Visual Studio 设置

我还添加了 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调试即可在本地使用正确的集群配置进行调试。


不错的方法,谢谢分享。我最终设置了每个开发人员的单独参数,并由他们手动更新发布配置文件。下次更改时,我将尝试应用相同的方法。谢谢。 - Diego Mendes

5
当我们使用Visual Studio调试解决方案时,Service Fabric的VS扩展定义了一个硬编码的发布配置文件。它会检查我的集群有多少节点,并根据集群的节点数量创建到Local.5Node.xml和Local.1Node.xml的链接。
为了实现相同的结果,我们最终使用自定义应用程序参数,并且每个开发人员都更新发布配置文件(Local.5node.xml)以指向他们各自的应用程序参数文件。
虽然这不是所需功能的自动化方式,但可以解决主要问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接