2009-05-12 10 views
10

Tôi có một vấn đề kỳ lạ với cách msbuild hoạt động với Dự án Triển khai Web VS2008 và muốn biết tại sao nó có vẻ sai trái một cách ngẫu nhiên.Làm cách nào để xóa nhiều tệp với dự án triển khai msbuild/web?

Tôi cần xóa một số tệp khỏi thư mục triển khai chỉ nên tồn tại trong môi trường phát triển của mình. Các tập tin đã được tạo ra bởi các ứng dụng web trong dev/thử nghiệm và không được bao gồm trong dự án/giải pháp Visual Studio của tôi.

Cấu hình tôi đang sử dụng như sau:

<!-- Partial extract from Microsoft Visual Studio 2008 Web Deployment Project --> 
<ItemGroup> 
    <DeleteAfterBuild Include="$(OutputPath)data\errors\*.xml" /> <!-- Folder 1: 36 files --> 
    <DeleteAfterBuild Include="$(OutputPath)data\logos\*.*" /> <!-- Folder 2: 2 files --> 
    <DeleteAfterBuild Include="$(OutputPath)banners\*.*" />  <!-- Folder 3: 1 file --> 
</ItemGroup> 

<Target Name="AfterBuild"> 
    <Message Text="------ AfterBuild process starting ------" Importance="high" /> 
    <Delete Files="@(DeleteAfterBuild)"> 
     <Output TaskParameter="DeletedFiles" PropertyName="deleted" /> 
    </Delete> 
    <Message Text="DELETED FILES: $(deleted)" Importance="high" /> 
    <Message Text="------ AfterBuild process complete ------" Importance="high" /> 
</Target> 

Tôi có vấn đề là khi tôi làm một xây dựng/xây dựng lại của Dự án Web Deployment nó "đôi khi" loại bỏ tất cả các tập tin nhưng đôi khi nó sẽ không loại bỏ bất cứ điều gì! Hoặc nó sẽ loại bỏ chỉ một hoặc hai trong ba thư mục trong nhóm mục DeleteAfterBuild. Dường như không có sự nhất quán khi quá trình xây dựng quyết định xóa các tệp hay không.

Khi tôi đã chỉnh sửa cấu hình để chỉ bao gồm Thư mục 1 (ví dụ), nó sẽ xóa tất cả các tệp chính xác. Sau đó, thêm Thư mục 2 và 3, nó bắt đầu xóa tất cả các tệp như tôi muốn. Sau đó, dường như vào những thời điểm ngẫu nhiên, tôi sẽ xây dựng lại dự án và nó sẽ không xóa bất kỳ tập tin nào!

Tôi đã thử di chuyển các mục này vào nhóm mục ExcludeFromBuild (có thể là ở đâu) nhưng nó mang lại cho tôi kết quả không thể đoán trước.

Có ai đã trải nghiệm điều này không? Tôi có làm điều gì sai? Lý do tại sao điều này xảy ra?

Trả lời

27

Các <ItemGroup> được đánh giá khi tải kịch bản và trước khi <Target> đã được xử lý.

Có vẻ như nhiều hơn một cách để làm điều này một cách chính xác -

  1. Bao gồm <ItemGroup> bên trong <Target> và nó nên được đánh giá vào thời điểm chính xác. Điều này sẽ làm việc với MS-Build v3.5 +

  2. Sử dụng <CreateItem> để tạo ra các danh sách mục

Ví dụ xây dựng kịch bản cho điều này -

<!-- Using ItemGroup --> 
<Target Name="AfterBuild"> 
    <ItemGroup> 
    <DeleteAfterBuild Include="$(OutputPath)data\errors\*.xml" /> 
    </ItemGroup> 
    <Delete Files="@(DeleteAfterBuild)" /> 
</Target> 

<!-- Using CreateItem --> 
<Target Name="AfterBuild"> 
    <CreateItem Include="$(OutputPath)data\errors\*.xml"> 
    <Output TaskParameter="Include" ItemName="DeleteAfterBuild"/> 
    </CreateItem> 
    <Delete Files="@(DeleteAfterBuild)" /> 
</Target> 

Để giải thích tại sao quá trình xóa được tạo kết quả 'không thể đoán trước' -

  1. Bắt đầu với đường dẫn đầu ra xây dựng sạch
  2. Xây dựng số 1 - xây dựng Dự án triển khai web. @(DeleteAfterBuild) sẽ đánh giá không có tệp nào vì tệp không tồn tại trong thư mục $(OutputPath) và sẽ không xóa bất kỳ tệp nào như một phần của mục tiêu AfterBuild
  3. Build # 2 - xây dựng Dự án Triển khai Web.@(DeleteAfterBuild) sẽ đánh giá với tất cả các tệp được mong đợi trong thư mục $(OutputPath) và sẽ xóa các tệp này như một phần của mục tiêu AfterBuild
  4. Về cơ bản chúng tôi hiện đang quay lại giai đoạn 2. Lặp lại. Kết quả là tất nhiên có thể dự đoán được - làm xước đầu bạn không còn nữa.

tham khảo tài liệu: How To: Create Item Groups on the Fly, Delayed evaluation of items in MSBUILD file

+0

+1 - Tôi đã có cùng một đầu chính xác. Đây là một câu trả lời hoàn hảo. Cảm ơn! – spot

4

Kiểm tra mục nhập blog tôi vừa đăng MSBuild: Item & Property Evaluation, tôi nghĩ rằng nó có thể giúp bạn. Hãy cho tôi biết nếu không.

Sayed Ibrahim Hashimi

0

Tôi nhận ra điều này đã được trả lời nhưng tôi nghĩ tôi sẽ thêm tôi 5 cent. Đối với dự án Triển khai web, không cần sử dụng các mục tiêu được cung cấp, chỉ cần thêm nhóm mục chứa các phần tử ExcludeFromBuild. Tôi đã cung cấp phần có liên quan từ cuối tệp dự án triển khai của tôi để tham khảo.

<Import Project="$(MSBuildExtensionsPath)\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets" /> 
    <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
     Other similar extension points exist, see Microsoft.WebDeployment.targets. 
    <Target Name="BeforeBuild"> 
    </Target> 
    <Target Name="BeforeMerge"> 
    </Target> 
    <Target Name="AfterMerge"> 
    </Target> 
    <Target Name="AfterBuild"> 
    </Target> 
    --> 
    <ItemGroup> 
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\obj\**\*.*" /> 
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\Properties\**\*.*" /> 
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.csproj*" /> 
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.resx" /> 
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.Publish.xml" /> 
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\LocalTestRun.testrunconfig" /> 
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\TestResults\**\*.*" /> 
    </ItemGroup>