2013-02-08 27 views
11

Mam aplikację WPF, którą chcę wdrożyć dla naszych użytkowników za pośrednictwem ClickOnce. Mamy cztery środowiska, testowanie systemu, testowanie użytkownika, równoległą produkcję i produkcję. Każdy potrzebuje innego pliku konfiguracyjnego z nazwami serwerów i innymi rzeczami specyficznymi dla środowiska, aby nie wszystkie mogły korzystać z tej samej podstawy kodu. Większość kodu jest taka sama, ale ostateczny pakiet będzie nieco inny z powodu różnych plików .config.Wdrażanie Clickonce w wielu środowiskach

To, co znajduję, polega na tym, że instalujemy wersję w testowaniu użytkowników, powiedzmy w wersji 05, a następnie testują, a kiedy nadejdzie czas, aby nadać im kolejną wersję, powinniśmy po prostu mieć możliwość zaktualizowania pakietu na serwerze testowym użytkownika, a następnie mogą zaktualizować swoją wersję, klikając adres URL wdrażania. Ale kiedy to robią, mówi "aplikacja z tą samą tożsamością już istnieje" i musimy odinstalować za pośrednictwem panelu sterowania, aby zainstalować wersję 06. To wydaje się złe, a nie punkt kliknięcia.

Jak zasugerowałbym, aby zbudować i wdrożyć tę aplikację w czterech różnych środowiskach, tak aby w każdym środowisku można było po prostu umieścić nową wersję na serwerze, a użytkownicy testujący lub używający go z tego środowiska będą po prostu ciągnąć w dół aktualizacji i nie trzeba odinstalować czegokolwiek?

Odpowiedz

2

Po pierwsze nie można zainstalować aplikacji o tej samej nazwie wdrożenia z dwóch różnych adresów URL bez konieczności deinstalowania pierwszej. ClickOnce używa tego do bezpieczeństwa, aby upewnić się, że ktoś nie będzie próbował przejąć twojego wdrożenia.

Po drugie, aby wykonać różne kompilacje, można skonfigurować cztery foldery w ramach projektu, po jednym pod każdą nazwą. Następnie skonfiguruj cztery konfiguracje kompilacji (nazwij je tym samym). Następnie skonfiguruj polecenie post-build, które skopiuje pliki do folderu \ bin. Jeśli skonfigurujesz nazwy folderów, aby zawierały w nich konfigurację kompilacji, zostaną skopiowane te, które dotyczą tej konfiguracji.

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

Po trzecie, trzeba dołączyć pliki w projekcie tak samo będą oznaczone zostać włączone do wdrożenia, nawet jeśli zastąpienie ich polecenia kopiowania po kompilacji jest wykonywana. I cztery katalogi również muszą być uwzględnione, nawet jeśli ostatecznie nie są używane.

+0

Nie jestem pewien, że to będzie działać, gdy publikuje manifest będzie nadal odnosząc do oryginalnego serwera? Nie możesz edytować pliku manifestu, ponieważ nie jest on podpisany? – MickyD

0

Próbowałem zrobić to samo przez ostatnie dwa dni bez powodzenia. Moja obecna metoda wykonuje następujące operacje:

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 

Pierwszą przeszkodą uderzę była świadomość, że należy ponownie skompilować aplikację, jeśli chcesz zmienić nazwę pliku config, wersji lub produktów. Po prostu uruchomienie publikowania po zwykłej kompilacji nie wykona tego zadania. W tym momencie doszedłem do wniosku, że to zadziała, ponieważ każdy ma inny URL instalacji i inną nazwę produktu w manifeście aplikacji, jednak wciąż pozostają w konflikcie z tą samą wiadomością, którą widzisz. Jeśli zadziała, wrócę i zaktualizuję to za pomocą poprawki.

11

został szukają rozwiązania się przez jakiś czas, to uderzyło mnie, że ostateczna jeden wpadłem jest rzeczywiście tak proste, jak to:

  • Slow Cheetah do przekształcania plików konfiguracyjnych na podstawie wybranego kompilacji konfiguracja (np. debugowanie/wydawanie)
  • Grupa właściwości na konfigurację konfiguracji z konkretnymi właściwościami projektu typu "kliknij raz" (np. nazwa produktu i nazwa zespołu (dla równoległej instalacji wersji testowej i wersji prod), InstallUrl) w pliku projektu.
  • Określanie dodatkowych właściwości (jak ApplicationVersion, MinimumRequiredVersion) przez msbuild podczas wykonywania/cel: publikować

Nie ma potrzeby, aby skopiować wszystkie pliki konfiguracyjne ręcznie jak powolny gepard będzie obsługiwać tego. Pakiet click once zostanie utworzony w folderze wyjściowym danej konfiguracji kompilacji (np. Bin/Debug lub cokolwiek masz).

Największą zaletą jest to, że kompilacja jest taka sama jak przy użyciu Visual Studio lub automatycznych kompilacji przy użyciu msbuild (z wyjątkiem kilku dodatkowych właściwości, które są całkowicie opcjonalne). Wszystko, co musisz zrobić, aby dodać dodatkowe środowiska do swojej kompilacji, to tworzenie nowych konfiguracji kompilacji i odpowiednich powolnych transformacji gepardów oraz grupy właściwości w pliku projektu.

Cała instalacja działa przynajmniej z .NET 3.5 (nie można mówić o wcześniejszych wersjach) i później.

Może to pomaga każdemu. Zapraszam do zapytania o szczegóły.

PS: Grupy własności wyglądać następująco (umieścić je po pierwszej grupy nieruchomości, który określa domyślne ustawienia 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

W jaki sposób zachować Visual Studio od nadpisywania właściwości InstallUrl, UpdateURl i ProductName za każdym razem, gdy zmienia się konfigurację kompilacji? – MyItchyChin

+2

@MyItchyChin Cóż, tak naprawdę nie. Grupy właściwości nie powinny być zmieniane, o ile nie otworzy się strony właściwości projektu w programie Visual Studio. Dodatkowo kontrola źródła upewnia Cię, że przynajmniej zauważysz i będziesz mieć szansę na powrót, jeśli coś pójdzie nie tak. Wciąż o wiele lepiej niż używając maga ... –

Powiązane problemy