2010-05-25 10 views
70

Vì vậy, tôi đã cài đặt VS 2010 và đang trong quá trình sửa đổi kịch bản MSBuild của tôi cho tích hợp xây dựng TeamCity của chúng tôi. Mọi thứ đều hoạt động tốt với một ngoại lệ.MSBuild Script và VS2010 xuất bản áp dụng Web.config Chuyển đổi

Làm thế nào tôi có thể nói MSBuild mà tôi muốn áp dụng Web.conifg chuyển đổi tập tin mà tôi đã tạo ra khi tôi xuất bản xây dựng ...

Tôi có những điều sau đây trong đó sản xuất các trang web biên soạn nhưng, nó xuất ra một tệp Web.config, Web.Debug.config và Web.Release.config (Tất cả 3) vào thư mục kết quả được biên dịch. Trong studio khi tôi thực hiện xuất bản lên hệ thống tệp, nó sẽ thực hiện chuyển đổi và chỉ xuất ra Web.config với các thay đổi thích hợp ...

<Target Name="CompileWeb"> 
    <MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" /> 
</Target> 

<Target Name="PublishWeb" DependsOnTargets="CompileWeb"> 
    <MSBuild Projects="myproj.csproj" 
    Targets="ResolveReferences;_CopyWebApplication" 
    Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder); 
       OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" /> 
</Target> 

Bất kỳ trợ giúp nào sẽ tuyệt vời ..!

Tôi biết điều này có thể được thực hiện bằng các phương tiện khác nhưng tôi muốn làm điều này bằng cách sử dụng mới VS 2010 cách nếu có thể

Trả lời

62

Tôi đang tìm kiếm thông tin tương tự và không hoàn toàn tìm thấy nó, vì vậy tôi đã thực hiện một số thao tác xung quanh trong các tệp .targets đi kèm với Visual Studio 2010 và MSBuild 4.0. Tôi đã tìm ra đó là nơi tốt nhất để tìm kiếm công việc MSBuild có thể thực hiện chuyển đổi.

Theo như tôi đã có thể nói, nhiệm vụ MSBuild sau được sử dụng:

<Project ToolsVersion="4.0" 
     DefaultTargets="Deploy" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

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

    <PropertyGroup> 
     <ProjectPath>C:\Path to Project\Here</ProjectPath> 
     <DeployPath>C:\Path to Deploy\There</DeployPath> 
     <TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile> 
     <TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile> 
     <TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile> 
     <StackTraceEnabled>False</StackTraceEnabled> 
    </PropertyGroup> 


    <Target Name="Transform"> 
     <TransformXml Source="$(TransformInputFile)" 
         Transform="$(TransformFile)" 
         Destination="$(TransformOutputFile)" 
         Condition="some condition here" 
         StackTrace="$(StackTraceEnabled)" /> 
    </Target> 
</Project> 

tôi đã thử nghiệm trên và có thể xác nhận rằng nó hoạt động. Bạn có thể cần phải tinh chỉnh cấu trúc một chút để phù hợp với kịch bản xây dựng của bạn tốt hơn.

+4

điều này rất giống với giải pháp mà tôi đã kết thúc. Chỉ báo trước là hành động TransformXml hiện có một lỗi mà nó không đóng tệp nguồn và do đó bạn không thể loại bỏ tệp nguồn. Chỉ cần một cái gì đó để xem xét; trong trường hợp của tôi sau khi tôi đã thực hiện chuyển đổi, tôi muốn loại bỏ cả tệp Debug.config và Release.config khỏi thư mục triển khai. Để giải quyết vấn đề này cho đến khi MS khắc phục sự cố. Bạn có thể chỉ cần sao chép nguồn và chuyển đổi tập tin vào một thư mục tạm thời và sau đó sao chép các tập tin vừa được chuyển đổi trở lại sau đó bạn sẽ có thể xóa/gỡ bỏ các tập tin ... – Jason

+1

Vâng, tôi nhấn lỗi đó khi tôi đã cố gắng nó ra . Đó là lý do tại sao tôi phải sử dụng $ (ProjectPath) và $ (DeployPath). Trên thực tế, tôi sẽ đề nghị sử dụng một vị trí trung gian để thu thập tất cả các tạo phẩm xây dựng (bao gồm tệp Web.config) và sau đó triển khai tới các máy chủ web khác nhau từ vị trí đó chứa tất cả các tạo phẩm. Điều này sẽ tiết kiệm từ việc chuyển đổi Web.config nhiều lần, giả sử tất cả các máy chủ web sẽ có cùng một tệp Web.config. –

+2

+1 để giải quyết vấn đề của tôi từ http://stackoverflow.com/questions/2992778/asp-net-web-config-transformation-wont-work-in-installer –

13

Bạn sẽ có thể thực hiện việc này bằng cách sử dụng mục tiêu Gói và chỉ định thư mục tạm thời.

msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish 

http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/

+0

Chỉ có vấn đề là cách tiếp cận này sẽ không áp dụng biến cấu hình cho chuỗi kết nối. –

+0

Tất cả các biến đổi web.config sẽ hoạt động bằng phương pháp này. Tại sao chuỗi kết nối đặc biệt không hoạt động? – pattersonc

+2

Vì chuỗi kết nối được xử lý khác nhau và bạn sẽ thấy một mã thông báo thay thế: http://troy.hn/gYb7M5 Đó là trừ khi bạn ghi đè : http://troy.hn/mk8iJL –

8

Ngoài ra, bạn hãy thử sử dụng chuyển đổi XDT Tool:

http://ctt.codeplex.com

Tôi đang sử dụng này thay vì làm rối tung với mục tiêu msbuild che khuất. Hoạt động với app.config không chỉ web.config.

5

Nó làm việc cho tôi với sự thay đổi sau

<MSBuild Projects="$(ProjectFile)" 
     Targets="ResolveReferences;_WPPCopyWebApplication" 
    Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" /> 

Từ Microsoft.WebApplication.chỉ tiêu nộp dưới thư mục MSBuild

_CopyWebApplication 

This target will copy the build outputs along with the 
content files into a _PublishedWebsites folder. 

This Task is only necessary when $(OutDir) has been redirected 
to a folder other than ~\bin such as is the case with Team Build. 

The original _CopyWebApplication is now a Legacy, you can still use it by 
setting $(UseWPP_CopyWebApplication) to true. 
By default, it now change to use _WPPCopyWebApplication target in 
Microsoft.Web.Publish.targets. 
It allow to leverage the web.config trsnaformation. 
+0

Tôi đang sử dụng nant và mục tiêu TransformWebConfig sẽ không hoạt động cho tôi cho đến khi tôi cũng thêm _WPPCopyWebApplication đích. Điều này đã khắc phục được sự cố của tôi. – SouthShoreAK

1

Đây là một writeup tuyệt vời về biến đổi tùy chỉnh:

http://www.diaryofaninja.com/blog/2011/09/14/using-custom-webconfig-transformations-in-msbuild

Chúng tôi cần phải tùy chỉnh web các triển khai hơn một chút so với bình thường do tấn classic ASP và nastiness khác chúng tôi phải thích ứng. Bài viết này đã tiết kiệm thời gian đào bới thông qua các mục tiêu MS.

+0

Bài viết đó thực hiện một công việc tuyệt vời để giải thích điều gì đã xảy ra với cách chuyển đổi cấu hình được thực hiện. – mhenry1384