Tôi có một ứng dụng WPF mà tôi muốn triển khai cho người dùng của mình thông qua ClickOnce. Chúng tôi có bốn môi trường, kiểm tra hệ thống, kiểm tra người dùng, sản xuất song song và sản xuất. Mỗi nhu cầu một tập tin cấu hình khác nhau với tên máy chủ và những thứ khác cụ thể cho môi trường để họ không thể sử dụng cùng một cơ sở mã. Hầu hết các mã là như nhau nhưng gói cuối cùng sẽ hơi khác nhau vì các tệp .config khác nhau. Điều tôi đang tìm kiếm là chúng tôi cài đặt phiên bản trong thử nghiệm của người dùng, cho biết phiên bản 05, sau đó họ kiểm tra và sau đó khi đến lúc cung cấp cho họ phiên bản tiếp theo, chúng tôi chỉ có thể đặt gói được cập nhật trên máy chủ web thử nghiệm của người dùng, sau đó họ có thể cập nhật phiên bản của họ bằng cách nhấp vào URL triển khai. Nhưng khi họ làm điều này nó nói "ứng dụng với cùng một danh tính đã tồn tại" và chúng tôi phải gỡ bỏ cài đặt thông qua bảng điều khiển để có được phiên bản 06 để cài đặt. Điều này có vẻ sai và không phải là điểm của clickonce. Làm thế nào bạn đề nghị tôi xây dựng và triển khai ứng dụng này cho bốn môi trường khác nhau để trong mỗi môi trường chúng ta có khả năng chỉ cần đặt một phiên bản mới trên máy chủ và người dùng thử nghiệm hoặc sử dụng nó từ môi trường đó sẽ chỉ kéo cập nhật và không cần gỡ cài đặt gì?Triển khai nhấp chuột vào nhiều môi trường
Trả lời
Trước tiên, bạn không thể cài đặt ứng dụng có cùng tên triển khai từ hai URL khác nhau mà không phải gỡ cài đặt một URL đầu tiên. ClickOnce sử dụng tính năng này để bảo mật để đảm bảo ai đó không cố gắng chiếm đoạt triển khai của bạn.
Thứ hai, để thực hiện các bản dựng khác nhau, bạn có thể thiết lập bốn thư mục trong dự án, một thư mục với mỗi tên. Sau đó thiết lập bốn cấu hình xây dựng (gọi chúng là cùng một thứ). Sau đó, thiết lập lệnh sau xây dựng sao chép các tệp vào thư mục \ bin. Nếu bạn thiết lập tên thư mục để có cấu hình xây dựng trong chúng, nó sẽ sao chép bất kỳ cái nào đi kèm với cấu hình đó.
COPY/Y "$(TargetDir)myfile_$(ConfigurationName)\*.*" "$(TargetDir)"
Thứ ba, bạn phải bao gồm các tập tin trong dự án riêng của mình vì vậy họ sẽ được đánh dấu để được đưa vào triển khai, ngay cả khi bạn đang thay thế chúng bằng một lệnh copy sau khi xây dựng được thực hiện. VÀ bốn thư mục phải được bao gồm là tốt, mặc dù cuối cùng họ không được sử dụng.
Tôi đã cố gắng làm điều tương tự trong hai ngày qua mà không có may mắn. Phương pháp hiện tại của tôi thực hiện như sau:
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
Trở ngại đầu tiên mà tôi đạt được là bạn phải biên dịch lại ứng dụng nếu bạn muốn thay đổi tệp cấu hình, phiên bản hoặc tên sản phẩm. Đơn giản chỉ cần chạy một xuất bản sau khi xây dựng thường xuyên sẽ không hoàn thành nhiệm vụ này. Tại thời điểm này, tôi đã tìm ra điều này sẽ hoạt động vì mỗi URL có một URL cài đặt khác nhau và một tên sản phẩm khác trong tệp kê khai ứng dụng, tuy nhiên chúng vẫn xung đột với cùng một thông báo bạn đang thấy. Nếu tôi nhận được nó làm việc tôi sẽ trở lại và cập nhật này với sửa chữa.
Có được tìm kiếm một giải pháp bản thân mình một thời gian, nó đánh tôi rằng một trong những trận chung kết tôi đã đưa ra thực sự là đơn giản như này:
- Slow Cheetah cho chuyển các tập tin cấu hình dựa trên chọn xây dựng Cấu hình (ví dụ Debug/Release)
- Một nhóm thuộc tính cho mỗi cấu hình xây dựng với các thuộc tính dự án cụ thể (ví dụ: ProductName và AssemblyName (để cài đặt thử nghiệm song song và phiên bản prod), InstallUrl) trong tệp dự án.
- Xác định thuộc tính bổ sung (như ApplicationVersion, MinimumRequiredVersion) thông qua msbuild khi thực hiện/target: xuất bản
Không cần phải sao chép bất kỳ tập tin cấu hình cheetah thủ công như chậm sẽ xử lý việc này. Nhấp một lần gói sẽ được tạo trong thư mục đầu ra của cấu hình xây dựng tương ứng (ví dụ: bin/Debug hoặc bất kỳ thứ gì bạn có).
Lợi thế lớn nhất là việc xây dựng là giống nhau cho việc sử dụng Visual Studio hoặc xây dựng tự động bằng cách sử dụng msbuild (ngoại trừ một số thuộc tính bổ sung hoàn toàn không bắt buộc). Tất cả những gì bạn phải làm để bổ sung thêm các môi trường vào xây dựng của bạn là tạo các cấu hình xây dựng mới và các biến đổi cheetah chậm tương ứng và một nhóm thuộc tính trong tệp dự án.
Toàn bộ thiết lập hoạt động ít nhất với .NET 3.5 (không thể nói về các phiên bản cũ hơn) và sau đó.
Có thể điều này giúp mọi người. Hãy hỏi để biết chi tiết.
PS: Các nhóm tài sản giống như thế này (đặt chúng sau khi nhóm bất động sản đầu tiên xác định các thiết lập ClickOnce mặc định):
<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>
Làm cách nào để giữ cho Visual Studio không thể ghi các thuộc tính InstallUrl, UpdateURl và ProductName bất cứ khi nào bạn thay đổi cấu hình xây dựng? – MyItchyChin
@MyItchyChin Vâng, thực sự thì không. Các nhóm thuộc tính không nên thay đổi miễn là bạn không mở trang thuộc tính dự án trong Visual Studio. Ngoài ra, kiểm soát nguồn đảm bảo rằng ít nhất bạn nhận thấy và có cơ hội hoàn nguyên nếu có sự cố. Vẫn tốt hơn rất nhiều so với sử dụng pháp sư ... –
Tôi không chắc chắn điều này sẽ làm việc khi xuất bản manifest vẫn sẽ được đề cập đến máy chủ gốc? Và bạn không thể tự chỉnh sửa tệp kê khai bởi vì nó không được ký? – MickyD