2013-03-27 12 views
43

Pakuję przykładowy kod dla dystrybucji SDK. W dystrybucji względna ścieżka od kodu do zestawów SDK różni się od maszyny budującej. Na przykład:.csproj wiele ścieżek wskazówek dla zespołu

Distribution

csharp/bin/assembly.dll 
example/ex1/ex1.csproj 

Budowa Maszyn

foo/sdk/csharp/bin/assembly.dll 
bar/baz/quux/ex1/ex1.csproj 

Załóżmy, że nic nie mogę ruszyć. Czy istnieje sposób mogę polecić ex1.csproj spojrzeć w obie

../../csharp/bin/i../../../../foo/sdk/csharp/bin/ dla assembly.dll?

W C++ umieściłem ścieżkę zależności w niezależnym arkuszu właściwości i rozpowszechniłem inną wersję za pomocą SDK. Ale C# nie ma arkuszy właściwości i nie chcę utrzymywać dwóch wersji całego projektu.

Widziałem this question, który stwierdził, że nie mogę używać wielu znaczników <HintPath>, więc szukam innego sposobu przybliżenia tego samego zachowania.

+1

Wystarczy dodać obiekt do pliku .csproj i używać go w HintPath.Możesz nadpisać jego wartość na maszynie budującej za pomocą opcji msbuild.exe/p. –

Odpowiedz

20

znalazłem hacky rozwiązanie, które działa dla mojego przypadku, gdy katalog nadrzędny jest gwarantowana być inny gdzieś w górę drzewa:

<Choose> 
    <When Condition="Exists('$(MSBuildProjectDirectory)\..\..\example')"> 
    <ItemGroup> 
     <Reference Include="Assembly ..."> 
     <HintPath>..\..\csharp\bin\assembly.dll</HintPath> 
     </Reference> 
    </ItemGroup> 
    </When> 
    <Otherwise> 
    <ItemGroup> 
     <Reference Include="Assembly ..."> 
     <HintPath>..\..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath> 
     </Reference> 
    </ItemGroup> 
    </Otherwise> 
</Choose> 
+1

'> od Wolf5 odpowiedź poniżej to betterer . – berkus

0

Można subst folder /csharp/bin do napędu (różnie na każdym komputerze), na przykład X: a następnie odwołać X:\ lub X:\bin na obu komputerach, jak ścieżka teraz będzie tak samo.

+0

To zbyt skomplikowane. Użytkownik SDK musi mieć możliwość rozpakowania pakietu SDK, otwarcia przykładowego projektu i skompilowania go bez dodatkowych kroków. – japreiss

+0

Wciąż bym postępował w ten sam sposób - wykorzystując ścieżkę SDK użytkownika jako odniesienie i wykonując sztuczki z linkami do folderów na komputerze kompilacji, aby go tam uruchomić – Axarydax

+0

To znaczy, że utworzyłbym łącze do katalogu .. \ .. \ csharp to point do .. \ .. \ .. \ .. \ foo \ sdk, więc ex1.csproj znajdzie ten zestaw w .. \ .. \ csharp – Axarydax

6

dodać drugorzędną ścieżkę w następujący sposób do ogólnej grupy nieruchomości. w csproj złożyć

<PropertyGroup> 
    <ReferencePath>..\..\..\..\..\foo\sdk\csharp\bin\</ReferencePath> 
    ... 
</PropertyGroup> 

Obiekt ReferencePath ma być określona podczas wykonywania msbuild, ale to będzie działać tak dobrze.

-1

Po prostu dodaj lokalizację serwera kompilacji bibliotek DLL jako ścieżkę odniesienia w projekcie. Wydaje się, że ładnie działa i jest bardzo prosta. Działa tylko wtedy, gdy znasz folder serwera plików DLL kompilacji.

enter image description here

+0

Korzystam z programu Visual Studio 2012 i przechowuję szczegóły ścieżki referencyjnej w pliku csproj.user nie csproj Jakiej wersji Studio używasz lub czy istnieje jakieś ustawienie, które sprawi, że Studio wstawi szczegóły ścieżki referencyjnej do pliku csproj? –

+0

Głosowanie w dół, ponieważ tylko aktualizuje csproj.user i oczekuje się, że ścieżka będzie istnieć na maszynie programistów podczas korzystania z pokazanego GUI. – rob

53

Najprostszym sposobem, ponieważ tylko jeden HintPath może być używany jest użycie all-tak piękny atrybut Stan takiego:

<Reference Include="TheAssembly"> 
    <HintPath Condition="Exists('..\My\Assembly\Path')">..\My\Assembly\Path\TheAssembly.dll</HintPath> 
    <HintPath Condition="Exists('..\..\My\Assembly\Path')">..\..\My\Assembly\Path\TheAssembly.dll</HintPath> 
    <HintPath Condition="Exists('..\..\..\My\Assembly\Path')">..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath> 
    <HintPath Condition="Exists('..\..\..\..\My\Assembly\Path')">..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath> 
    <HintPath Condition="Exists('..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath> 
    <HintPath Condition="Exists('..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath> 
    <HintPath Condition="Exists('..\..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath> 
    etc... 
</Reference> 

Więc odpowiedź na pytanie byłoby to:

<Reference Include="assembly"> 
    <HintPath Condition="Exists('..\..\csharp\bin')">..\..\csharp\bin\assembly.dll</HintPath> 
    <HintPath Condition="Exists('..\..\..\..\foo\sdk\csharp\bin')">..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath> 
</Reference> 
+0

co powiesz na http://www.codeproject.com/Articles/184718/Take-of--Reference-Paths-in-Visual-Studio – Gurpreet

+0

Yup. Myślę, że to też by zadziałało. Ta sama odpowiedź, którą napisał Filip. – Wolf5

+0

Myślę, że to się zepsuje, gdy tylko więcej niż jeden warunek będzie słuszny. Oznacza to, że istnieją zarówno 'csharp \ bin' i' .. \ .. \ foo \ sdk \ csharp \ bin'. –

Powiązane problemy