2013-02-08 129 views
11

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

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

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

回答

2

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

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

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

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

+0

我不知道这个时候发布清单仍然会指将工作到原始服务器?你不能手动编辑清单文件,因为它没有签名? – MickyD 2014-03-31 06:23:32

0

我一直试图在过去两天做同样的事情,没有运气。我目前的方法执行以下操作:

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\systest.config C:\Product\app.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:\Product\bin\Release\app.publish systest.app.publish 

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\usertest.config C:\Product\app.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:\Product\bin\Release\app.publish usertest.app.publish 

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\parallelprod.config C:\Product\app.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:\Product\bin\Release\app.publish parallelprod.app.publish 

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\prod.config C:\Product\app.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:\Product\bin\Release\app.publish prod.app.publish 

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

11

已经有一段时间寻找一个解决方案我自己,我突然想到,我想出了最后一个居然是如此简单:

  • Slow Cheetah基于选择的构建转化配置文件配置(例如调试/发布)
  • 每个构建配置的属性组以及项目文件中特定的一次性项目属性(例如ProductName和AssemblyName(用于并行安装测试和产品版本),InstallUrl)。
  • 执行/目标时指定附加属性(比如ApplicationVersion,MinimumRequiredVersion)通过的msbuild:发布

没有必要复制任何配置文件手动慢猎豹将处理此。点击一次包将在相应的构建配置的输出文件夹中创建(例如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> 
+3

无论何时更改构建配置,如何让Visual Studio不会过度编写InstallUrl,UpdateURl和ProductName属性? – MyItchyChin 2016-03-08 15:24:07

+2

@MyItchyChin嗯,其实我没有。只要不在Visual Studio中打开项目属性页面,就不应更改属性组。此外,源代码控制可确保您至少注意到并有机会在出现问题时恢复。还是比使用法师好多了...... – 2016-04-08 07:57:17