2008-09-26 39 views
13

Có ai có phương pháp khắc phục giới hạn 260 ký tự của công cụ MSBuild để xây dựng các dự án và giải pháp Visual Studio từ dòng lệnh không? Tôi đang cố gắng để có được xây dựng tự động bằng cách sử dụng CruiseControl (CruiseControl.NET không phải là một lựa chọn, vì vậy tôi đang cố gắng để buộc nó vào kịch bản ant bình thường) và tôi tiếp tục chạy vào các vấn đề với chiều dài của đường dẫn. Để làm rõ, vấn đề nằm trong độ dài đường dẫn của các dự án được tham chiếu trong tệp giải pháp, vì công cụ không thu gọn đường dẫn xuống đúng cách: (Các giải pháp hạn chế cấu trúc thư mục MSBuild

Tôi cũng đã cố gắng sử dụng DevEnv mà đôi khi hoạt động và đôi khi ném một ngoại lệ , điều này không tốt cho việc xây dựng tự động trên một máy tính riêng biệt. Vì vậy, vui lòng không đề xuất sử dụng tính năng này như là một sự thay thế.

+0

Tôi nhận thấy rằng khi vs2008 thực hiện xây dựng, có vẻ như chạy một tập các mục tiêu msbuild khác với MSbuild đơn giản được thực thi theo cc.net - có lẽ câu trả lời nằm trong một trong những mục tiêu đó – Richard

Trả lời

7

Có vẻ như đó là hạn chế của MSBuild. Chúng tôi đã có cùng một vấn đề, và cuối cùng, chúng tôi đã có để có được con đường rút ngắn, bởi vì không tìm thấy bất kỳ giải pháp khác mà làm việc đúng cách.

+0

Sau nhiều ngày nỗ lực, điều này có vẻ như những gì tôi sẽ phải yêu cầu. Rất may một cấu trúc đường dẫn mới (ngắn hơn) đang được đề xuất cho các dự án này, do đó, vấn đề sẽ biến mất sau đó :) – workmad3

+0

System.IO của khung .Net (v1.0-v3.5) có giới hạn này và MSBuild đang sử dụng .Mạng lưới. (Hiện tại cách duy nhất xung quanh việc này là sử dụng PInvoke về mọi nơi mà đường dẫn được sử dụng.) –

+2

Có ai có thể xác nhận rằng đây không phải là vấn đề trong msbuild 4.0 không? –

0

Bạn đã thử đường dẫn DOS chưa? Hoặc thư mục \\? \ Tiền tố? .NET BCL team blog có thêm thông tin.

7

SUBST command ảnh tĩnh có vẻ như tồn tại để việc sắp xếp lại thư mục gốc của thư mục dựng lên ký tự ổ đĩa có thể tiết kiệm một số ký tự nếu giải pháp của Judah Himango không tốt.

+0

Họ đã được SUBST vào thư mục gốc phổ biến nhất của cấu trúc thư mục: (Nó sẽ hoạt động nếu tên đường dẫn không quá dài mặc dù vậy. – workmad3

+0

Chúng tôi đang sử dụng subst để xây dựng Bộ công cụ Silverlight, nó không phải là hoàn hảo, nhưng hack này là một bước đầu tiên tốt 1 Jason –

+0

Điều này có thể khắc phục các vấn đề của chúng tôi với MSBuild filepaths, ít nhất là bây giờ – nebffa

2

Có hai loại vấn đề đường dẫn liên quan đến xây dựng. Một là đường dẫn không thực sự quá dài, nhưng có rất nhiều ".. \" trong chúng. Thông thường, đây là các giá trị HintPath của tham chiếu. MSBuild nên bình thường hóa các đường dẫn này xuống dưới giới hạn tối đa, để chúng hoạt động.

Loại đường dẫn khác chỉ đơn giản là quá dài. Xin lỗi, nhưng những thứ này sẽ không hoạt động. Sau khi xem xét nó một chút công bằng, vấn đề là chỉ có không đủ API hỗ trợ cho đường dẫn dài. Nhóm BCL (xem blog của họ) có vấn đề tương tự. Chỉ một số API của Win32 hỗ trợ định dạng \? \. Công cụ xây dựng tùy ý và có thể 98% ứng dụng trên mạng, không; và tệ hơn có lẽ sẽ hành xử tệ (nghĩ về tất cả các bộ đệm có kích thước cho MAX_PATH). Chúng tôi đi đến kết luận rằng cho đến khi có một nỗ lực hệ sinh thái lớn để làm cho con đường dài hoạt động, hoặc Windows đi kèm với một số cách khéo léo để làm cho họ làm việc anyway (như con đường ngắn mangling?) Con đường dài chỉ là không thể để MSBuild hỗ trợ. Cách giải quyết bao gồm subst, như bạn tìm thấy; nhưng nếu cây của bạn chỉ đơn giản là quá sâu, các tùy chọn duy nhất của bạn là xây dựng nó theo từng mảnh hoặc rút ngắn tên thư mục. Lấy làm tiếc.

Dan/MSBuild

+0

Bạn có thể xây dựng trên ".. \" là một vấn đề, chúng tôi có tập tin tương đối các đường dẫn không quá dài và ngay cả khi được chuyển đổi thành đường dẫn tuyệt đối có ít hơn 200 ký tự, nhưng chúng vẫn thất bại trong cuộc gọi csc.exe. – nietras

1

tôi thấy vấn đề là rằng khi biên dịch C# (csc.exe) được gọi là nó sử dụng PROJECTDIRECTORY dự án đường dẫn thư mục cùng với đường dẫn đầu ra OUTPUTPATH ​​bằng cách gắn thêm chúng như:

PROJECTDIRECTORY + OUTPUTPATH ​​

Tuy nhiên, nếu OUTPUTPATH ​​là tương đối ie ".. \ .. \ Build \ ProjectName \ AnyCPU_Debug_Bin \" và thư mục của dự án là khá dài sau đó tổng chiều dài dài hơn 259 ký tự kể từ khi con đường sẽ là:

PROJECTPATH ​​+ ".. \ .. \ Build \ ProjectName \ AnyCPU_Debug_Bin \"

thay vì một đường dẫn tuyệt đối.

Nếu csc.exe sẽ tạo đường dẫn tuyệt đối trước khi gọi hàm Win32, thao tác này sẽ hoạt động. Vì trong trường hợp của chúng ta, chiều dài đường dẫn tuyệt đối nhỏ hơn 160 ký tự.

Vì lý do nào đó, cuộc gọi tới csc.exe từ studio trực quan sau đó khác với MSBuild so với từ studio trực quan. Không biết lý do tại sao.

Trong mọi trường hợp, sự cố có thể được giải quyết bằng cách thay đổi cả hai hoặc cả hai đường dẫn PROJECTDIRECTORY và/hoặc OUTPUTPATH.

4

tôi giải quyết vấn đề tương tự bằng cách điều chỉnh csproj-file:

<BaseIntermediateOutputPath>$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..\..\..\Intermediate\$(AssemblyName)_$(ProjectGuid)\'))</BaseIntermediateOutputPath> 

Theo kết quả quá trình biên dịch csc.exe nhận đường dẫn đầy đủ thay vì một tương đối.

Nhờ harrydev cho đầu mối về cách CSC.EXE hoạt động với các đường dẫn.

0

Nếu chiều dài đường dẫn là 260, thì có cảnh báo giải quyết tham chiếu, cho 259 hoặc 261 lỗi này không xảy ra. Tôi nghĩ rằng có lỗi msbuild.

0

Tôi biết đã có câu trả lời được chấp nhận, nhưng tôi đã gặp sự cố khác khi sử dụng msbuild cho tôi kết quả lỗi tương tự và dẫn tôi theo một cuộc săn đuổi ngỗng hoang dã. Vì vậy, đối với nhân viên của Google trong tương lai, ở đây đi:

Chúng tôi có một tập tin thực thi mà các cuộc gọi msbuild, nhưng khi xây dựng máy có thể xây dựng cho nhiều phiên bản của Visual Studio, mỗi tập tin batch gọi vcvarsall.bat trước khi nó chạy msbuild. Điều này có tác dụng phụ khó chịu của nhồi đường hoàn toàn đầy đủ của cùng một điều hơn và hơn nữa. Khi nó đầy, bạn sẽ gặp lỗi được hiển thị trong câu hỏi trên: The input line is too long. Một tìm kiếm đơn giản trên Google có thể khiến bạn nghĩ rằng đường dẫn của bạn đột nhiên quá dài cho msbuild.

Trong trường hợp của tôi, nó đơn giản như giết chết phiên cmd.exe và khởi động lại, vì điều này đã hoàn nguyên biến môi trường về trạng thái gốc của chúng.

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