2009-05-01 14 views
16

Podczas dodawania odwołania do projektu aplikacji WWW w VS (w tym przypadku 2008), jako odnośnik względny tworzona jest "ścieżka hintpath" w pliku csproj. Czy istnieje sposób (za pomocą graficznego interfejsu użytkownika, a nie ręczna edycja pliku), aby uczynić to bezwzględnym odwołaniem (np. C: \ Temp \ DllName.dll)?Wymuś odwołanie do absolutnego przy użyciu Visual Studio

Problem, na który napotykam, to sytuacja, w której poszczególne maszyny do kompilacji mają różne katalogi robocze dla projektu. Gdy odwołanie jest względne, a odwołanie do dll nie znajduje się w katalogu roboczym projektu, względne odniesienie może nie wskazywać tego samego położenia na obu komputerach.

+1

Jaki jest cel szukania niedokładnej ścieżki? Rozumiem, że potrzebuję ścieżki zawierającej specjalny folder, ale całkowicie zakodowana ścieżka jest nieelastyczna w różnych systemach. – STW

+2

@Yoooder Nie widziałeś wesołych względnych ścieżek, które studio graficzne lubi używać, ale równie dobrze może być zakodowane. Widziałem ich .. \ .. \ samych aż do katalogu głównego, a następnie z powrotem do folderu docelowego, to jest świetne. – hova

+0

Szukałem tego. Czemu? Mam kilka metod rozszerzenia, które można odzyskać po przełamaniu zmian w różnych wersjach aplikacji na przestrzeni lat. Dziękuję AutoDesk. Czekaj nie. Te metody rozszerzenia są uniwersalne we wszystkich moich aplikacjach. Nie chcę poprawiać każdej aplikacji na moim komputerze, ponieważ muszę zmienić lub dodać poprawkę do niespójności programu AutoCAD. Chcę to naprawić w jednym miejscu. Jedynym rozsądnym sposobem na to jest z lokalnym serwerem Nuget. Overkill dużo? –

Odpowiedz

-1

Chciałbym pomóc, ale dlaczego jest to konieczne? Nigdy nie musiałem tego robić nigdy - od premiery beta 2003. Myślę, że jest tu jeszcze jedno głębsze pytanie.

Jeśli trzeba można spróbować stronę ścieżki odniesienia we właściwościach projektu

+0

Zwykle dzieje się tak, gdy ktoś inny ładuje projekt do rozwiązania, w innej głębokości ścieżki niż pierwotnie utworzono. – hova

+2

Prowadziłem ekipy .net od lat i pójdziesz w ten sposób # @ # $. To jest pierwsza rzecz, którą naprawiam. Nakłoń wszystkich, aby ugryzli kulę i zorganizuj projekt rozwiązania oraz odniesienia do odcięcia kogokolwiek (beep), który {beep} z nim. – Gary

+0

To wyjaśnia, dlaczego nigdy nie musieliście tego robić. – hova

0

Spróbuj kliknąć prawym właściwości projektu, a następnie przechodząc do referencyjnych Ścieżki i dodanie tam ciężko kodowanych ścieżek.

+1

Zrobiłem to, ale wygląda na to, że nic nie zmienia w pliku .csproj. Czy nie trzeba tego dodawać na każdym komputerze typu dev/build? – Jeremy

5

Domyślnie Visual Studio używa referencji względnych, gdy referencja jest początkowo dodana, ponieważ zakłada, że ​​odniesienie dotyczy pliku znajdującego się w innym miejscu kopii roboczej.

ten używany do napędu mnie orzechy, ale rozwiązać go na trzy różne sposoby:

  1. Przy zachowaniu mojego kodu źródłowego na moim D: napęd, co oznacza, że ​​DLL odniesione na dysku C: nie można przechowywać ze względnymi ścieżkami.
  2. Przekonywanie uprawnień do tego, aby użyć pojedynczego obrazu/skryptu dla wszystkich stacji roboczych programistów. Teraz, gdy wszystkie są takie same, wszystkie pliki znajdują się w tym samym miejscu na dysku C :.
  3. Uświadamiając, że można dodawać foldery do AssemblyFolders registry key, co oznacza, że ​​nie trzeba już używać żadnych ścieżek do odwoływania się do znanych złożeń.
+1

Yar, umieszczenie go na innym dysku lub coś zmapowanego jako inny dysk wydaje się jedynym sposobem na pokonanie tego. –

+0

Link w 3 jest zepsuty .... czy to jest to? http://stackoverflow.com/a/238445/1507899 – RJB

+0

Wystarczająco blisko, tak. –

5

Jedynym sposobem, jaki znalazłem, jest ręczne edytowanie pliku csproj po dodaniu odnośnika.

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

i tak, nienawidzę bezwzględne ścieżki i cały obłęd automatycznego rozmieszczania go tworzy, ale w tym przypadku muszę odwołać otoki .NET, który używa biblioteki dll COM, który musi być „zainstalowany” i robić rzeczy do rejestru itp., więc jedyną drogą do zrobienia jest absolutna ścieżka.

10

To stare pytanie, ale wciąż jest aktualne. Natknąłem się na to, szukając rozwiązania, jak odwołać się do złożeń z globalnego repozytorium oprogramowania stron trzecich.

Moje podejście w tej chwili jest podobne do odpowiedzi napisanej przez thinkOfaNumber. Zamiast używać bezwzględnej ścieżki zakodowanej na stałe, wolę umieszczać zmienną środowiskową w pliku .csproj. Zmienna środowiskowa przechowuje bezwzględną ścieżkę. Przykład:

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

Dodatkowy poziom pośredni daje elastyczność różne ścieżki na różnych maszynach budowlanych (np Wywoływacz porównaniu serwera kompilacji).

Nadal jednak muszę ręcznie edytować plik .csproj, aby to zrobić.

+0

Tak, twoja odpowiedź jest tą, która naprawdę dociera do rzeczy. Głupio jest spierać się o to, kto będzie mógł sprawdzić, jaka jest ścieżka, i czy względne ścieżki czy bezwzględne ścieżki są najlepszymi połączeniami. W rzeczywistości, czy można twierdzić, że wszyscy programiści mają taką samą konfigurację, czy nie (NIE!), Sam serwer kompilacji może być inaczej skonfigurowany. Jeśli nie używasz zmiennych w ścieżkach wskazówek, to po prostu nie robisz tego w bardzo wyrafinowany lub elastyczny sposób. Powiedział, że Microsoft musi uczynić go intuicyjnym, aby można było zdefiniować zmienne projektu lub środowiska w celu przechowywania tych danych. – paulyphonic

+1

Firma Microsoft powinna także zezwalać na wiele elementów HintPath, aby były one iterowane, dopóki nie znajdzie dopasowania. W rzeczywistości zakładałem na podstawie słowa "podpowiedź" (jeśli dasz komuś wskazówkę, a to nie pomoże, prawdopodobnie powinieneś dać im inną wskazówkę ... "podpowiedź-podpowiedź"), że byłoby to dozwolone, i dowiedziałem się tylko dzięki wielu rozwiązywaniu problemów, że dba tylko o ostatni znaleziony element HintPath! – paulyphonic

+4

Należy pamiętać, że VS buforuje ścieżki do przywoływanych złożeń w pliku '.suo'. Jeśli więc zmienisz wartość zmiennej ENV THIRDPARTY_ROOT, nie zapomnij zamknąć rozwiązania i usuń plik '.suo', a następnie ponownie otwórz rozwiązanie. – SergeyT

0

Wystąpił również ten problem. Chcieliśmy użyć bezwzględnych ścieżek, ponieważ każde wdrożenie utworzyło folder Packages w różnych lokalizacjach (a także mamy wiele maszyn do kompilacji). Chodziło o to, aby pakiety NuGet znajdowały się w jednym miejscu, co uwolniłoby zmarnowaną pamięć od posiadania wielu kopii tego samego.

Naszym szczególnym problemem było to, że mogliśmy ustawić absolutną ścieżkę w pliku NuGet.Config, pakiety NuGet przywróciłyby tę lokalizację podczas wdrożenia, ale wtedy nie mogły znaleźć wszystkich podczas kroku MSBuild w to samo wdrożenie.

Napisałem skrypt PowerShell, aby rozwiązać ten problem. Zasadniczo zamienia względne odwołania HintPath na bezwzględną ścieżkę, którą chcę użyć.

#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 
} 

Postawiliśmy ten skrypt do uruchomienia jako etapu budowy PowerShell przed etapami MSBuild w naszej instalacji. Powoduje to, że pliki csproj są zmieniane w katalogu roboczym na maszynach budujących, ale nie w sterowaniu źródłami Visual Studio. (Jeśli chcesz, aby zmieniły się w kontroli kodu źródłowego, prawdopodobnie uruchomisz to w PowerShell i sprawdzisz zmiany.)

Powiązane problemy