2010-09-01 29 views
13

Sử dụng msbuild trong .NET 4.0, tôi có thể xây dựng dự án web với mục tiêu "Gói", và nó thực hiện một công việc tốt đẹp khi đặt gói trong một tệp nén. Tuy nhiên, khi tôi nhìn vào web.config trong đó, nó không được chuyển đổi, nó có "$ (ReplacableToken_Web_SiteConnection-Web.config Connection String_0)"MS Deploy có thể thực hiện một gói và chuyển đổi, nhưng không triển khai không?

Tôi có thể chạy mục tiêu "TransformWebConfig" và nó sẽ thực hiện chuyển đổi thích hợp , nhưng chỉ trong silo của chính nó.

Tôi cũng có thể chạy mục tiêu "Xây dựng" và chuyển các thuộc tính "DeployOnBuild = True; DeployTarget = MSDeployPublish" và nó sẽ triển khai gói trên máy chủ của tôi với biến đổi web.config được thực hiện đúng.

Nhưng, nếu tôi muốn tự triển khai gói cho máy chủ, làm cách nào để thực hiện "Gói" với "TransformWebConfig" để tệp zip có web.config cuối cùng trong đó?

Trả lời

10

Cách chúng tôi làm điều này là bằng cách sửa đổi dự án xây dựng để thực hiện chuyển đổi trước khi đóng gói.

Các mục tiêu là gọi TransformXml và là một phần của Microsoft.Web.Publishing.Tasks.dll

Trong mục tiêu của riêng bạn của nó

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" /> 

Nhưng nó sẽ được đưa vào một mặc định VS C# build .

Vì vậy

<TransformXml Source="web.config" Transform="web.release.config" Destination="$(DeployPath)\web.config" /> 

Liệu các trick cho chúng tôi.

Thiết lập các đường dẫn đó với đúng ItemGroup ("nội dung" nhiều khả năng nhất) và đảm bảo rằng mục tiêu được kích hoạt trước khi gọi tới Gói trong tệp .csproj của bạn và đầu ra xây dựng sẽ chứa "Web.config" như bình thường, với các giá trị được chuyển đổi đúng.

Hoặc (chúng tôi đã sử dụng gói này cần phải là mọi thứ cho mọi người), bạn có thể sử dụng mẹo đó để thực hiện tất cả các biến đổi và bao gồm từng biến trong gói cuối cùng.

Sau đó, bạn gọi Msdeploy bằng tay và sử dụng bỏ qua nó và thay thế chỉ thị (quên thuật ngữ kỹ thuật) để chỉ ra một trong những quyền tại triển khai thời gian

Giả sử bạn có một web.usethisone.config trong gói của bạn, mà trông giống như

-skip:objectname=filepath,absolutepath=web\..*\.config 

-replace:objectName=filepath,match=.*web\.usethisone\.config,replace=web.config 
+0

Cảm ơn, nó hoạt động như một sự quyến rũ và giúp tôi tiết kiệm rất nhiều thời gian. Tôi đã dành nhiều thời gian để chuyển đổi nhiều tập tin Web.config cho môi trường triển khai khác nhau. –

+0

Tôi đang vật lộn với cùng một vấn đề. Tôi đã thêm vào tệp .csproj của ứng dụng web của tôi, nhưng tôi không hoàn toàn hiểu nơi tôi nên đặt phần . Làm thế nào để tôi tìm ra đó là "đúng ItemGroup (" nội dung "có khả năng nhất)" và làm thế nào để tôi "đảm bảo rằng mục tiêu được bắn trước khi gọi đến gói" trong tập tin .csproj của tôi? –

12

Nếu bạn muốn bỏ qua điều này xảy ra thì bạn cần đặt thuộc tính trong tòa nhà của mình. Bạn có thể làm điều này theo hai cách

  1. Chỉnh sửa tập tin dự án của bạn
  2. Tạo một .wpp.targets nộp

Tôi muốn giới thiệu # 2. Trong trường hợp này, tạo một tệp mới trong cùng thư mục với tệp dự án của bạn có tên {ProjectName} .wpp.targets trong đó {ProjectName} là tên của dự án của bạn. Sau đó, bên trong tập tin này, bạn nên đặt các nội dung sau đây.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="4.0"> 
    <PropertyGroup> 
    <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings> 
    </PropertyGroup> 
</Project> 

Trong trường hợp này bạn đang thiết lập thuộc tính AutoParameterizationWebConfigConnectionStrings kể về Web Publishing đường ống để không chèn những {} placeholders trong web.config cho các dây kết nối.

+0

Điều đó đề cập đến trình giữ chỗ nhưng không giải thích cách áp dụng các biến đổi khi đóng gói. –

Các vấn đề liên quan