2009-05-01 27 views
16

Khi thêm tham chiếu vào dự án ứng dụng web trong VS (2008 trong trường hợp này), "đường dẫn gợi ý" trong tệp csproj đang được tạo làm tham chiếu tương đối. Có cách nào (bằng cách sử dụng GUI, không chỉnh sửa thủ công tệp) để làm cho tham chiếu tuyệt đối này (ví dụ: C: \ Temp \ DllName.dll) không?Buộc tham chiếu phải tuyệt đối bằng cách sử dụng Visual Studio

Vấn đề tôi đang gặp phải là khi các máy xây dựng riêng biệt có một thư mục làm việc khác nhau cho dự án. Khi tham chiếu là tương đối, và tham chiếu dll không nằm trong thư mục làm việc của dự án, tham chiếu tương đối có thể không trỏ đến cùng một vị trí trên cả hai máy.

+1

Mục đích của việc muốn một đường dẫn không tương đối là gì? Tôi có thể hiểu rằng muốn có một con đường bao gồm một SpecialFolder, nhưng một con đường được mã hóa hoàn toàn cứng là không linh hoạt trên các hệ thống. – STW

+2

@Yoooder Bạn chưa từng thấy các đường dẫn tương đối vui nhộn mà studio thích sử dụng, nó cũng có thể được mã hóa cứng. Tôi đã nhìn thấy chúng .. \ .. \ mình tất cả các con đường lên đến gốc và sau đó trở lại thư mục đích, nó là tuyệt vời. – hova

+0

Tôi đang tìm kiếm điều này. Tại sao? Tôi có một vài phương pháp mở rộng phục hồi từ những thay đổi đột phá trong các phiên bản khác nhau của ứng dụng trong những năm qua. Cảm ơn bạn AutoDesk. Đợi đã, không. Các phương pháp Mở rộng này phổ biến trong tất cả các ứng dụng của tôi. Tôi không muốn phải vá mọi ứng dụng trên máy tính của mình vì tôi cần thay đổi hoặc thêm bản sửa lỗi cho sự không thống nhất của AutoCAD. Tôi muốn sửa nó ở một nơi. Cách duy nhất khác để làm điều này là với một máy chủ Nuget cục bộ. Quá nhiều? –

Trả lời

-1

Tôi muốn trợ giúp nhưng tại sao điều này lại cần thiết? Tôi chưa bao giờ phải làm điều này bao giờ - kể từ phiên bản beta vs.net 2003. Tôi nghĩ có một câu hỏi sâu hơn ở đây.

Nếu bạn phải bạn có thể thử trang Đường dẫn tham khảo trong các thuộc tính dự án

+0

Thông thường, điều này xảy ra khi ai đó tải dự án vào một giải pháp, ở độ sâu đường dẫn khác với độ sâu ban đầu được tạo. – hova

+2

Tôi đã lãnh đạo đội .net trong nhiều năm và bạn sẽ đi # @ # $ hạt theo cách này. Đây là điều đầu tiên tôi sửa chữa. Yêu cầu mọi người cắn viên đạn và tổ chức dự án giải pháp của bạn và tham chiếu đến việc cắt bỏ {beep} người {beep} của bất kỳ ai với nó. – Gary

+0

Vâng, điều đó giải thích lý do tại sao bạn chưa bao giờ phải làm điều này sau đó. – hova

0

Hãy thử click chuột phải vào các tính chất của dự án, và sau đó sẽ tham khảo Paths, và thêm các đường dẫn cứng được mã hóa đó.

+1

Tôi đã làm điều này, nhưng nó dường như không thực sự thay đổi bất cứ điều gì trong tập tin .csproj. Vì vậy, điều này sẽ không phải được thêm vào mỗi dev/xây dựng máy? – Jeremy

5

Theo mặc định, Visual Studio sử dụng các tham chiếu tương đối khi tham chiếu ban đầu được thêm vào, vì nó giả định tham chiếu đến tệp ở nơi khác trong bản sao làm việc của bạn.

này được sử dụng để lái xe cho tôi hạt, nhưng tôi giải quyết nó theo ba cách khác nhau:

  1. Bằng cách giữ mã nguồn của tôi trên D của tôi: ổ đĩa, có nghĩa là DLL được giới thiệu trên ổ C: không thể được lưu trữ với đường dẫn tương đối.
  2. Bằng cách thuyết phục quyền hạn có thể sử dụng một hình ảnh/tập lệnh duy nhất cho tất cả các máy trạm của nhà phát triển. Bây giờ tất cả chúng đều giống nhau, tất cả các tệp đều ở cùng một nơi trên ổ C :.
  3. Bằng cách nhận ra rằng bạn có thể thêm thư mục vào AssemblyFolders registry key, có nghĩa là bạn không còn phải sử dụng đường dẫn dưới bất kỳ hình thức nào để tham khảo các hội đồng đã biết.
+1

Yar, đặt nó trên ổ đĩa khác, hoặc một cái gì đó ánh xạ như một ổ đĩa khác có vẻ như là cách duy nhất để đánh bại này. –

+0

Liên kết trong 3 bị hỏng .... phải không? http://stackoverflow.com/a/238445/1507899 – RJB

+0

Đóng đủ, vâng. –

5

Cách duy nhất tôi tìm thấy để thực hiện việc này là chỉnh sửa tệp csproj theo cách thủ công sau khi thêm tham chiếu.

<Reference Include="foo, Version=1.2.3.4, Culture=neutral, ..."> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>C:\absolute\path\foo.dll</HintPath> 
</Reference> 

và vâng, tôi ghét đường dẫn tuyệt đối và tất cả sự điên rồ triển khai tự động nó tạo ra, nhưng trong trường hợp này tôi phải tham khảo một wrapper NET có sử dụng một dll COM mà đã được "cài đặt" và làm những việc để đăng ký, vv vì vậy một con đường tuyệt đối là cách duy nhất để đi.

10

Đây là câu hỏi cũ nhưng vẫn có liên quan. Tôi stumbled khi nó trong khi tìm kiếm một giải pháp làm thế nào để tham khảo hội đồng từ một kho lưu trữ toàn cầu của phần mềm của bên thứ ba.

Cách tiếp cận của tôi tại thời điểm này tương tự với câu trả lời được viết bởi thinkOfaNumber. Thay vì sử dụng đường dẫn tuyệt đối được mã hóa cứng, tôi thích nhúng một biến môi trường vào tệp .csproj. Biến môi trường sau đó giữ đường dẫn tuyệt đối. Ví dụ:

<Reference Include="Foo"> 
    <HintPath>$(THIRDPARTY_ROOT)\foo\3.1.0\bin\foo.dll</HintPath> 
</Reference> 

Đây là cấp độ thêm về mình cho sự linh hoạt để có đường dẫn khác trên xây dựng các máy khác nhau (ví dụ hệ thống phát triển so với build server).

Tôi vẫn cần chỉnh sửa thủ công tệp .csproj để thực hiện việc này.

+0

Vâng, câu trả lời của bạn là câu trả lời đúng. Đó là ngớ ngẩn để tranh luận về những người được thực hiện cuộc gọi trên những gì con đường được, và liệu đường dẫn tương đối hoặc đường dẫn tuyệt đối là cuộc gọi tốt nhất. Thực tế là liệu bạn có thể khẳng định tất cả các nhà phát triển có cùng một thiết lập hay không (KHÔNG!), Bản thân máy chủ xây dựng có thể được thiết lập khác nhau. Nếu bạn không sử dụng các biến trong đường dẫn gợi ý của bạn thì bạn chỉ không làm điều này một cách rất tinh vi hoặc linh hoạt. Điều đó nói rằng, Microsoft cần phải làm cho nó trực quan để các biến dự án hoặc môi trường có thể được định nghĩa để giữ dữ liệu này. – paulyphonic

+1

Microsoft cũng nên cho phép nhiều phần tử HintPath sao cho nó sẽ lặp qua chúng cho đến khi tìm thấy kết quả phù hợp. Trong thực tế, tôi giả định dựa trên từ "gợi ý" (nếu bạn đưa cho ai đó một gợi ý, và nó không giúp được gì, bạn có lẽ nên cho họ gợi ý khác ... "gợi ý") rằng điều này sẽ được cho phép, và chỉ phát hiện ra thông qua xử lý sự cố nhiều mà nó chỉ quan tâm đến phần tử HintPath cuối cùng mà nó tìm thấy! – paulyphonic

+4

Hãy nhớ rằng VS lưu trữ đường dẫn đến các assembly được tham chiếu trong tập tin '.suo'. Vì vậy, nếu bạn thay đổi giá trị của biến THIRDPARTY_ROOT env, đừng quên đóng giải pháp và xóa tệp '.suo', sau đó mở lại giải pháp. – SergeyT

0

Chúng tôi cũng gặp sự cố này. Chúng tôi muốn sử dụng đường dẫn tuyệt đối vì mỗi triển khai đã tạo thư mục Packages ở các vị trí khác nhau (và chúng tôi cũng có nhiều máy xây dựng). Ý tưởng là để có các gói NuGet ở một nơi, mà sẽ giải phóng bộ nhớ lãng phí từ việc có nhiều bản sao của cùng một thứ.

Vấn đề cụ thể của chúng tôi là chúng tôi có thể đặt đường dẫn tuyệt đối trong tệp NuGet.Config, gói NuGet sẽ khôi phục vị trí đó trong quá trình triển khai, nhưng sau đó không thể tìm thấy tất cả trong bước MSBuild trong cùng triển khai.

Tôi đã viết một kịch bản PowerShell để giải quyết vấn đề này. Về cơ bản nó thay thế các tham chiếu HintPath tương đối bằng đường dẫn tuyệt đối mà tôi muốn sử dụng.

#Get list of all csproj files in a solution 
$dir = Get-ChildItem $pwd -Recurse 
$list = $dir | Where {$_.extension -eq ".csproj"} 

#Replace relative paths with absolute path 
$absolutePath = 'C:\absolute\path\Packages' 
function replaceRelativePath($line){ 
    if($line -match '<HintPath>[^C].+\\Packages') 
    { 
     $relative = $matches[0] -replace '\\','\\' 
     return ($line -replace "$relative", "<HintPath>$absolutePath") 
    } 
    else 
    { 
     return $line 
    } 
} 

#Updating files 
Foreach($file in $List) 
{ 
    (Get-Content $file.FullName)| ForEach-Object{replaceRelativePath($_)} | Set-Content $file.FullName 
} 

Chúng tôi đặt tập lệnh này chạy dưới dạng bước xây dựng PowerShell trước các bước MSBuild trong triển khai của chúng tôi. Kết quả là các tệp csproj được thay đổi cho thư mục làm việc trên các máy xây dựng nhưng không phải trong điều khiển nguồn Visual Studio. (Nếu bạn muốn họ thay đổi trong điều khiển nguồn, bạn có thể chạy điều này trong PowerShell và kiểm tra các thay đổi.)

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