Clickonce部署到多个环境

我有一个WPF应用程序,我想通过ClickOnce部署到我们的用户。 我们有四个环境,系统测试,用户测试,并行生产和生产。 每个需要一个不同的配置文件,其中包含特定于环境的服务器名称和其他内容,因此它们不能全部使用相同的代码库。 大部分代码是相同的,但由于不同的.config文件,最终的包会略有不同。

我发现的是,我们在用户测试中安装了一个版本,说05版,然后他们测试,然后当它给他们下一个版本时,我们应该能够在用户测试中放置更新的软件包web服务器,那么他们可以通过点击部署URL来更新他们的版本。 但是当他们这样做时,它说“已经存在具有相同身份的应用程序”,我们必须通过控制面板进行卸载才能安装版本06。 这似乎是错误的,而不是clickonce的要点。

你会如何建议我将这个应用程序构建和部署到四个不同的环境中,以便在每个环境中我们都有能力在服务器上放置一个新版本,并且用户在该环境中测试或使用它将只需下载更新并不需要卸载任何东西?


一段时间以来我一直在寻找解决方案,这让我感到很震惊,我提出的最后一个解决方案其实很简单:

  • 缓慢的猎豹基于所选的构建配置来转换配置文件(例如调试/发布)
  • 每个构建配置的属性组与特定的一次性项目属性(例如ProductName和AssemblyName(用于测试和产品版本的并行安装),InstallUrl)在项目文件中。
  • 在执行/ target时通过msbuild指定其他属性(如ApplicationVersion,MinimumRequiredVersion):publish
  • 没有必要手动复制任何配置文件,因为缓慢的猎豹会处理这个问题。 点击一次包将在相应的构建配置的输出文件夹中创建(例如bin / Debug或任何你拥有的)。

    最大的优点是,构建使用Visual Studio或使用msbuild自动构建(除少数附加属性是完全可选的)之外是相同的。 所有你需要做的添加额外的环境到你的构建是创建新的构建配置和相应缓慢的猎豹转换和项目文件中的属性组。

    整个设置至少在.NET 3.5(不能说早期版本)和更高版本的情况下工作。

    也许这有助于任何人。 随意询问详情。

    PS:属性组看起来像这样(将它们放在定义默认ClickOnce设置的第一个属性组之后):

      <PropertyGroup Condition=" '$(Configuration)' == 'Demo' ">
        <AssemblyName>Com.MyApplication.Main.Demo</AssemblyName>
        <InstallUrl>http://demoserver/myapp/</InstallUrl>
        <ProductName>My Application %28Demo%29</ProductName>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)' == 'Test' ">
        <AssemblyName>Com.MyApplication.Main.Test</AssemblyName>
        <InstallUrl>http://testserver/myapp/</InstallUrl>
        <ProductName>My Application %28Test%29</ProductName>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)' == 'Prod' ">
        <AssemblyName>Com.MyApplication.Main</AssemblyName>
        <InstallUrl>http://prodserver/myapp/</InstallUrl>
        <ProductName>My Application</ProductName>
      </PropertyGroup>
    

    首先,您无法从两个不同的URL安装具有相同部署名称的应用程序,而无需首先卸载它。 ClickOnce使用此安全性来确保某人不会尝试劫持您的部署。

    其次,要做不同的构建,可以在项目下设置四个文件夹,每个文件夹各有一个名称。 然后设置四个构建配置(称它们为同一件事)。 然后设置一个后期制作命令,将文件复制到 bin文件夹中。 如果您将文件夹名称设置为在其中具有构建配置,则它将复制随该配置一起发布的文件夹名称。

    COPY/Y "$(TargetDir)myfile_$(ConfigurationName)*.*" "$(TargetDir)"
    

    第三,必须将这些文件包含在项目本身中,以便将它们标记为包含在部署中,即使在构建完成后使用复制命令替换它们也是如此。 而且这四个目录也必须包括在内,尽管最终它们不被使用。


    过去两天我一直在努力做到这一点,但没有运气。 我目前的方法执行以下操作:

    msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:ProductProduct.csproj
    del c:Productapp.config
    ren C:Productsystest.config C:Productapp.config
    msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="System Test Product";InstallUrl="http://systest.product.temp-uri.org/install/"
    ren C:ProductbinReleaseapp.publish systest.app.publish
    
    msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:ProductProduct.csproj
    del c:Productapp.config
    ren C:Productusertest.config C:Productapp.config
    msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="User Test Product";InstallUrl="http://usertest.product.temp-uri.org/install/"
    ren C:ProductbinReleaseapp.publish usertest.app.publish
    
    msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:ProductProduct.csproj
    del c:Productapp.config
    ren C:Productparallelprod.config C:Productapp.config
    msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="Parallel Prod Product";InstallUrl="http://parallelprod.product.temp-uri.org/install/"
    ren C:ProductbinReleaseapp.publish parallelprod.app.publish
    
    msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:ProductProduct.csproj
    del c:Productapp.config
    ren C:Productprod.config C:Productapp.config
    msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="Prod Product";InstallUrl="http://prod.product.temp-uri.org/install/"
    ren C:ProductbinReleaseapp.publish prod.app.publish
    

    我遇到的第一个障碍是意识到,如果您想更改配置文件,版本或产品名称,则必须重新编译应用程序。 在常规构建之后简单地运行发布将无法完成此任务。 在这一点上,我认为这将会起作用,因为每个人在应用程序清单中都有不同的安装URL和不同的产品名称,但它们仍然与您所看到的相同消息相冲突。 如果我得到它的工作,我会回来并修复这个问题。

    链接地址: http://www.djcxy.com/p/22727.html

    上一篇: Clickonce deployment to multiple environments

    下一篇: How to manually register ClickOnce file associations after installation?