用于为多个环境创建 ClickOnce 包的生成方法



这是我的场景:

我有一个通过 ClickOnce 交付的 WPF 应用程序。该应用程序为多个客户端提供了多个环境(目前为 9 个,但预计在不久的将来会翻一番(。

我目前使用的过程是(基本上(:

  • 令牌替换部分应用程序.config
  • 令牌替换生成 MSI 安装程序时使用的 WiX 文件的一部分(包括签名证书和指纹(
  • 构建解决方案
  • 创建特定于客户端/环境的安装程序
  • 对每个客户端/环境组合重复此操作

这样做的好处是,要安装应用程序,只需运行所需的安装程序即可。但是,缺点是,如果(何时(我需要创建新环境,则必须使用一组新的配置参数重新运行整个构建过程。

我怎样才能让这一切变得更好?

我的最新想法是,我将构建过程拆分为仅创建二进制文件。然后有一个单独的打包过程,该过程拉入适当的二进制文件、修补的配置、使用 MAGE 等(重新(签名的清单。

这将具有"一次构建,多次部署"的持续优势,同时确保如果需要新环境,可以在不重新构建二进制文件的情况下重新打包它们。

这听起来像是一个明智的方法吗?有人对这种情况有任何指导吗?

谢谢

我们有一个类似的方案,在多个环境中使用了一个 WPF ClickOnce 应用程序,其中 app.config 中唯一的内容是连接字符串。

为了解决这样一个事实,即如果没有为每个客户端/环境构建一个包的构建过程,就无法更改 clickonce 包中的配置文件,我们想出了一个解决方案,允许您将 app.config 文件放在服务器部署文件夹中,并让应用程序在运行时访问该文件。

为此,我们创建了一个静态类,该类在 app.xaml.cs OnStartup 事件中初始化。

公共静态类 DbConnectionString{ public static string ConnectionString { get; private set; } 公共静态字符串 ActivationPath { get; private set; }

public static void Init()
{
    string dbContext = "myDbContext";
    string configFile = "App.config";
    ConnectionString = "";
    ActivationPath = "";
    ActivationArguments actArg = AppDomain.CurrentDomain.SetupInformation.ActivationArguments;
    if (actArg != null)
    {
        if (actArg.ActivationData != null)
        {
            try
            {
                var actData = actArg.ActivationData[0];
                var activationPath = Path.GetDirectoryName(new Uri(actData).LocalPath);
                var map = new System.Configuration.ExeConfigurationFileMap();
                map.ExeConfigFilename = Path.Combine(activationPath, configFile);
                var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
                var connectionStringSection = config.ConnectionStrings;
                ConnectionString = connectionStringSection.ConnectionStrings[dbContext].ConnectionString;
                ActivationPath = activationPath;
            }
            catch (Exception)
            {
                ConnectionString = "";
                ActivationPath = "";
            }
        }
    }
}

}

在"发布/选项/清单"下的"项目设置"中,勾选"允许将 URL 参数传递给应用程序">

然后,我使用静态类的 ConnectionString 属性,其中需要连接字符串。除非仅将应用部署为联机应用,否则不会设置它,因此我们默认使用包中的 app.config 进行开发/测试。

它有点复杂,但效果很好,您只需发布一次应用程序,并为每个安装提供一个在构建之间不会更改的 app.config。

它还设置属性 ActivationPath,这是 clickonce 服务器安装目录的路径。

这听起来像是朝着正确方向迈出的一步,类似于我几年来为 WPF 应用程序所做的工作,并且运行良好。

我们使用 Team City 构建解决方案,然后有多个处理 ClickOnce 发布的生成后步骤,每个配置一个步骤。每个配置都涉及启动一个使用 Mage.exe 的 MSBuild 文件。它将解决方案输出文件复制到临时目录,然后对 App.config 等文件执行大量替换,并运行各种自定义 MSBuild 任务。

MSBuild 项目文件包含诸如 ClickOnce 下载 URL 之类的内容的基本设置和环境替代。我们还必须对生成的清单本身进行一些黑客替换(然后重新签名(,例如将特定文件标记为数据或不

标记。

最新更新