2013-02-08 28 views
5

Tôi có một số dự án được tham gia vào một giải pháp. Mỗi dự án đều có cấu trúc thư mục riêng và các tệp csproj nằm ở cấp độ khác nhau của cấu trúc thư mục. Mỗi csproj đều có thuộc tính OutputPath được chỉ định. OutputPath - là một đường dẫn tương đối và nó thay đổi từ dự án đến dự án theo cách sao cho tất cả các dự án có cùng một thư mục đầu ra. Đó là công việc OK nếu tôi xây dựng một dự án riêng biệt. Nhưng mọi thứ thay đổi nếu tôi cố gắng xây dựng tệp giải pháp. Trong trường hợp này, mỗi thư mục đầu ra của dự án khác nhau (phụ thuộc vào một số '.. \' trong OutputPath của dự án).Đường dẫn tương đối với dự án MSBuild vs giải pháp

Tôi biết, trước khi một lúc nào đó tất cả đều hoạt động tốt. Không ai thay đổi build.cmd không phải bất kỳ tệp sln hoặc csproj nào. Nhưng bây giờ tôi có tình huống được mô tả ở trên.

Vì vậy, câu hỏi của tôi là - điều gì ảnh hưởng đến cách đường dẫn tương đối được đánh giá? Tôi có nghĩa là làm thế nào tôi có thể lực lượng tương đối OutputPath được đánh giá bắt đầu từ thư mục mà csproj tập tin của dự án cụ thể đó nằm. Không phải từ thư mục có tệp .sln.

Let's assume I have following directory structure: 

dir1 
    a.sln 
    dir2 
    a.csproj 
    dir21 
    dir3 
     b.csproj 

a.csproj có đường dẫn đầu ra thiết lập để '../../_bin' mà chỉ là trên dir1 nếu tính từ a.csproj thư mục b.csproj có đường dẫn đầu ra thiết lập để' ../. ./../_bin 'giống nhau - chỉ khoảng dir1 nếu được tính từ b.csproj

a.sln chứa cả hai - a.csproj và b.csproj.

Khi tôi chạy msbuild tôi nhận được bản dựng dự án cho dự án 'dir1 /../../_ bin' và b 'dir1 /../../../_ bin' - cả hai đường dẫn tương đối của tệp dự án được tính từ vị trí tệp giải pháp, chứ không phải tệp dự án.

Trả lời

3

Vâng, tôi đã có thể tìm hiểu điều gì đã gây ra điều này. Đó là tệp .targets tuỳ chỉnh, đã suy ra thuộc tính SolutionDir khi bắt đầu bất kỳ msbuild nào. Tôi đã tìm ra rằng bằng cách sử dụng MSBuild Explorer. Công cụ này tỏ ra rất hữu ích trong trường hợp của tôi - tôi không biết các tệp .target của bên thứ ba trên hệ thống của tôi.

+0

+1000 Tôi đã có cùng một nguyên nhân gốc (ghi đè $ (OutputPath)) nhưng rất khác nhau vấn đề (* .designer.cs tập tin ngừng tái sinh) - chẩn đoán với MSBuild Explorer trong 5 phút. –

2

Từ Msbuild Import Element description

đường dẫn tương đối trong các dự án nhập khẩu được hiểu tương đối so với thư mục của các dự án nhập khẩu. Do đó, nếu tệp dự án là được nhập vào một số tệp dự án ở các vị trí khác nhau, thì đường dẫn tương đối trong tệp dự án đã nhập sẽ được hiểu là khác nhau cho từng dự án được nhập.

Tất cả các thuộc tính được bảo lưu của MSBuild liên quan đến tệp dự án, ví dụ, MSBuildProjectDirectory và MSBuildProjectFile, được tham chiếu trong dự án được nhập là giá trị được gán dựa trên tệp dự án nhập.

Nếu bạn thêm nhiều chi tiết hơn hoặc ít mẫu cho câu hỏi của mình - sẽ dễ hiểu vấn đề chính xác hơn.

Chỉnh sửa: Được rồi, hãy thử xác định bí ẩn đó. Đầu tiên - OutputPath có thể bị ảnh hưởng bởi các biến môi trường.

2 - trong khi xây dựng tệp sln được chuyển thành định dạng tệp dự án msbuild và được lưu trữ trong tệp tạm thời. Bạn có thể nhận được tập tin tạm thời đó nếu bạn thực hiện trong cmd "thiết lập msbuildemitsolution = 1" và sau đó kích hoạt xây dựng thông qua dòng lệnh. Ở đó bạn có thể kiểm tra tập tin đó và xem các dự án cá nhân của bạn được gọi như thế nào. Nhưng tôi cho rằng bạn sẽ thấy nhiều mục .csproj />. Và các thuộc tính msbuild toàn cầu được thừa hưởng bởi các cuộc gọi đó. Vì vậy, tôi nghi ngờ nếu mọi thứ đều tốt đẹp trước khi một số điểm và không có thay đổi được thực hiện - bạn đang thiếu biến môi trường OutputPath hoặc một số biến khác góp phần xây dựng OutputPath.

BTW - Tôi nghĩ nếu bạn muốn khắc phục sự cố của mình bằng cách buộc thư mục tương đối - bạn cũng có thể sử dụng $ (MSBuildProjectDirectory). Đây là một trong các thuộc tính msbuild dành riêng (từ here), nhưng điều này sẽ yêu cầu yo điều chỉnh OutputPath của bạn trong mỗi tệp csproj. Những gì tôi, cá nhân, thích để tránh, bởi vì nó có thể ảnh hưởng đến một số mục tiêu khác và giới thiệu các vấn đề tinh tế.

+0

Không chắc chắn ý bạn là gì bởi các dự án đã nhập, nhưng trong trường hợp của tôi tất cả các đường dẫn tương đối được diễn giải liên quan đến thư mục tệp giải pháp. Và tôi không chắc chắn làm thế nào để thay đổi điều đó ... – DarkDeny

+0

Cảm ơn sự giúp đỡ của bạn, nhưng tôi đã khắc phục vấn đề và đề cập rằng trong câu trả lời của tôi ở trên. Nhưng cảm ơn bạn đã tham gia! – DarkDeny

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