2010-05-25 25 views
13

Tôi có một dự án trong giải pháp của tôi đã bắt đầu cuộc sống như một dự án thư viện C#. Nó không có gì quan tâm đến nó về mặt mã, nó chỉ được sử dụng như một sự phụ thuộc vào các dự án khác trong giải pháp của tôi để đảm bảo rằng nó được xây dựng trước tiên. Một trong những tác dụng phụ của việc xây dựng dự án này là một AssemblyInfo.cs được chia sẻ được tạo ra có chứa số phiên bản được sử dụng bởi các dự án khác.Làm cách nào để ngăn chặn các tệp MSBuild bên ngoài được lưu vào bộ nhớ cache (bằng Visual Studio) trong khi xây dựng dự án?

Tôi đã làm điều này bằng cách thêm dòng sau vào file csproj:

<ItemGroup> 
    <None Include="Properties\AssemblyInfo.Shared.cs.in" /> 
    <Compile Include="Properties\AssemblyInfo.Shared.cs" /> 
    <None Include="VersionInfo.targets" /> 
</ItemGroup> 
<Import Project="$(ProjectDir)VersionInfo.targets" /> 
<Target Name="BeforeBuild" DependsOnTargets="UpdateSharedAssemblyInfo" /> 

Các tập tin tham chiếu, VersionInfo.targets, chứa những điều sau đây:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <!-- 
     Some properties defining tool locations and the name of the 
     AssemblyInfo.Shared.cs.in file etc. 
    --> 
    </PropertyGroup> 
    <Target Name="UpdateSharedAssemblyInfo"> 
    <!-- 
     Uses the Exec task to run one of the tools to generate 
     AssemblyInfo.Shared.cs based on the location of AssemblyInfo.Shared.cs.in 
     and some of the other properties. 
    --> 
    </Target> 
</Project> 

Nội dung của VersionInfo. tệp mục tiêu có thể chỉ đơn giản là được nhúng trong tệp .csproj nhưng nó là bên ngoài vì tôi đang cố gắng biến tất cả điều này thành một mẫu dự án. Tôi muốn người dùng mẫu có thể thêm dự án mới vào giải pháp, chỉnh sửa tệp VersionInfo.targets và chạy bản dựng.

Vấn đề là sửa đổi và lưu tệp VersionInfo.targets và xây dựng lại giải pháp không có hiệu lực - tệp dự án sử dụng các giá trị từ tệp .targets như khi dự án được mở. Ngay cả dỡ hàng và tải lại dự án cũng không có hiệu lực. Để có được các giá trị mới, tôi cần phải đóng Visual Studio và mở lại nó (hoặc tải lại giải pháp).

Làm cách nào để thiết lập cấu hình này để cấu hình nằm ngoài tệp .csproj và không được lưu trong bộ nhớ cache giữa các bản dựng?

+0

bản sao có thể có của [Cách tắt bộ nhớ đệm của các định nghĩa xây dựng trong Visual studio] (http://stackoverflow.com/questions/4919204/how-to-turn-off-caching-of-build-definitions-in- visual-studio) – yoyo

+0

một bản sao có thể khác: http://stackoverflow.com/questions/2012742/how-to-stop-visual-studio-caching-imported-msbuild-scripts –

Trả lời

3

Theo như tôi biết, bạn không thể. Visual Studio không sử dụng MSBuild 'thực', nó sử dụng một công cụ xây dựng nội bộ hoạt động rất giống với MSBuild.exe, nhưng vẫn có một số khác biệt tinh tế. Công cụ xây dựng này lưu trữ các mục tiêu, vì vậy bạn phải khởi động lại VS khi bạn thay đổi một cái gì đó. Tôi tin rằng, nó thậm chí còn được ghi lại ở đâu đó, và không có cách giải quyết nào được biết đến (tôi đã tìm kiếm cách đây khoảng một năm và không tìm thấy gì).

Bạn có thể buộc VS tải lại các mục tiêu thông qua VS API - vì vậy, bạn sẽ phải tạo (hoặc tìm) một tiện ích bổ sung tùy chỉnh để thực hiện việc này.

Một tùy chọn khác là sử dụng một thứ khác ngoài tệp .targets để lưu trữ cấu hình của bạn. Ví dụ, bạn có thể sử dụng một tập tin văn bản đơn giản và phân tích nó với MSBuild (không phải là thanh lịch, nhưng nó sẽ làm việc).

Cập nhật.

Đó là những gì tôi đã làm một số thời gian trước đây. MSBuild gọi một công cụ bên ngoài thông qua Exec với WorkingDirectory = "$ (SolutionDir)", công cụ "biết" tất cả các quy ước về tên tệp, vị trí vv, do đó, một thư mục làm việc là đủ để hoàn thành công việc. Dữ liệu cấu hình khác được lưu trữ trong cấu hình của công cụ bên ngoài, vì vậy không có vấn đề với bộ nhớ đệm.

Ngoài ra, hãy xem this question về việc đọc các mục từ một tệp. Tôi cho rằng, các bộ tốt hơn nhu cầu của bạn.

+0

Cảm ơn, @VladV. Tùy chọn cấu hình bên ngoài giống như một khả năng. Tôi là một newbie hoàn thành MSBuild mặc dù - bạn có thể giới thiệu một số tài liệu tham khảo để đọc tài sản từ các tập tin bên ngoài? –

+0

MSBuild Tham khảo tại MSDN: http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx. Các tác vụ cộng đồng MSBuild (một số mở rộng hữu ích cho MSBuild): http://msbuildtasks.tigris.org/. – VladV

+0

Tôi đã triển khai một loại trình phân giải phụ thuộc cho MSBuild và nó đã sử dụng một số cấu hình bên ngoài, nhưng hiện tại tôi không có mã. Tôi sẽ cố gắng tìm một số ví dụ cho bạn trong một vài giờ. – VladV

2

Tôi đã có một số thành công liên tục bằng cách sửa đổi tệp dự án bao gồm tệp msbuild tùy chỉnh và làm cho tệp không hợp lệ, sau đó tải lại dự án, để cho nó không tải, sau đó sửa tệp dự án và tải lại.

Đôi khi nó hoạt động, đôi khi không, nhưng tốt hơn khởi động lại Visual Studio.

+0

Các hack sau đây xuất hiện để làm việc: Hủy bỏ các dự án từ các giải pháp (nhấp chuột phải dự án, "Hủy bỏ"). Sau đó thêm lại (giải pháp nhấp chuột phải, "Thêm" - "Dự án hiện tại ...", duyệt tới tệp csproj). –

1

Nếu bạn cần một cách nhanh chóng và bẩn để sửa chữa nó, bạn có thể chỉ cần tải lại các giải pháp (thông qua https://stackoverflow.com/a/6877056/182371).

Bạn có thể thực hiện bằng cách đóng mở tệp giải pháp hoặc bằng cách nhấn Lưu trong trình chỉnh sửa bên ngoài (sau đó khi bạn quay lại VS, nó sẽ hỏi bạn có muốn tải lại) hay không.

+0

Bộ nhớ cache có thể tồn tại khi tải lại (sau khi tệp '.sln' được cập nhật trên đĩa), vì vậy ngay cả sau khi tải lại, sự cố vẫn tiếp diễn. –

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