„Dodaj jako łącze” dla folderów w projektach programu Visual Studio

129

W programie Visual Studio możemy „Dodaj jako łącze”, aby dodać łącze do pliku w innym projekcie w rozwiązaniu.

Czy można to zrobić dla całych folderów, tak aby cały folder w projekcie A był widoczny w projekcie B, bez konieczności ręcznego tworzenia linków do nowych elementów w tym folderze?

kpozin
źródło

Odpowiedzi:

144

Jak stwierdził ten post na blogu , jest to możliwe.

<ItemGroup>
    <Compile Include="any_abs_or_rel_path\**\*.*">
        <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    </Compile>
</ItemGroup>

Pamiętaj jednak, że pliki nie zostaną skopiowane.

mo.
źródło
18
+1. Możesz również użyć <Content ...>i dodać, <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>aby program Visual Studio kopiował zasoby podczas kompilacji.
Markus Jarderot
8
Spróbuj użyć: <None>...</None>zamiast <Compile>...</Compile>. Ale myślę, że i tak skopiuje te pliki, nawet VisualStudio robi to z połączonymi plikami.
pon.
4
@mo. Twoja odpowiedź dodaje linki do wszystkich plików w katalogu głównym projektu, czasami jest to niewygodne. % (RecursiveDir) należy zmienić na nazwę folderu łącza: na przykład, aby połączyć folder źródłowy z projektu wp7 „MyMainProject” w innym projekcie w tym rozwiązaniu: <ItemGroup> <Compile Include = ".. \ .. \ MyMainProject \ MyMainProject \ engine *. * "> <link> silnik \% (filename) </ link> </ Compile> </ ItemGroup>
Tertium
24
Musiałem użyć, <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>aby zapobiec upuszczaniu rozszerzeń z nazw plików.
Joe Daley
2
W przypadku zasobów Icon Png: <EmbeddedResource Include = ".. \ .. \ Icons \ 16 * .png">
ChrisB,
126

W VS2012 i nowszych wersjach można przeciągnąć folder do innego projektu z wciśniętym klawiszem Alt . To tak samo, jak ręczne, ale szybsze dodawanie każdego pliku jako łącza.

upd : Rozważ użycie projektów udostępnionych, jeśli używasz VS2013 Update 2 (z Menedżerem odniesień do projektów udostępnionych ) lub VS2015.

mt_serg
źródło
1
W VS2010 wykonanie tej czynności spowoduje skopiowanie plików i katalogów zamiast dodawania ich jako łączy, tworząc niechciane duplikaty.
Tom,
3
Uwaga: folder należy przeciągnąć z Eksploratora Windows (nie z innej instancji programu Visual Studio). Musi to być również przeciągnięcie lewym przyciskiem myszy, a nie przeciągnięcie prawym przyciskiem myszy. Działa świetnie w VS2012.
davidpricedev
11
Myślę, że po prostu tworzy linki do wszystkich plików w folderze źródeł, a nie łącze do samego folderu. Oznacza to, że jeśli dodasz plik do folderu źródłowego, nie zostanie on automatycznie połączony.
Johnny5
1
@MauryMarkowitz, powinieneś przeciągnąć folder z projektu VS, a nie z eksploratora Windows lub czegoś innego.
mt_serg
1
@MauryMarkowitz, jedno rozwiązanie, dwa projekty. Przeciągnij Folder1 z Project1 do Project2 z wciśniętym klawiszem Alt. Każdy plik z Project1 / Folder1 zostanie dodany do Project2 / Folder1 jako łącze.
mt_serg
38

Jeden dodatek do odpowiedzi z mo. oraz komentarz Marcusa, jeśli łączysz elementy treści, musisz dołączyć rozszerzenie pliku:

<ItemGroup>
  <Compile Include="any_abs_or_rel_path\**\*.*">
    <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Compile>
</ItemGroup>
Czad
źródło
co to jest <Compile ...w tym. W moim przypadku muszę odnieść .tspliki do mojego nowego projektu. jak to jest zrobione. dzięki!
Rahmathullah M
23

Jeśli chodzi o część pierwotnego zapytania, w której folder połączony pojawia się w IDE, jest to możliwe, więc w eksploratorze rozwiązań znajduje się folder ze wszystkimi połączonymi plikami w środku, zamiast wszystkich plików pojawiających się w katalogu głównym rozwiązanie. Aby to osiągnąć, należy dodać:

  <ItemGroup>
    <Compile Include="..\anypath\**\*.*">
      <Link>MyData\A\%(RecursiveDir)%(FileName)%(Extension)</Link>
    </Compile>
  </ItemGroup>

Spowoduje to uwzględnienie wszystkich plików z połączonego katalogu w nowym folderze w eksploratorze rozwiązań o nazwie MyData. „A” w powyższym kodzie można nazwać dowolnie, ale musi tam być, aby folder się pojawił.

Adam
źródło
wydaje się, że załatwia sprawę, ale nie składa plików Form w jeden i wyświetla błędy dla ich plików resx (używam VB). W każdym razie dzięki.
Ivan Ferrer Villa
1
@IvanFerrerVilla, tak, zauważyłem pewne problemy, ale w większości jest to dobre tylko dla wyglądu.
Adam
3
W przypadku programu Visual Studio 2015 działało to nawet bez litery „A”.
Martin,
8

Jeśli chcesz dodać folder jako odniesienie i nie chcesz go kompilować, użyj:

<Content Include="any_path\**\*.*">
  <Link>folder_in_B_project\%(RecursiveDir)%(FileName)%(Extension)</Link>
</Content>
Neshta
źródło
-1

Rozbij powłokę i dodaj symboliczne łącze.

runas Administrator

mklink /d LinkToDirectory DirectoryThatIsLinkedTo

Dowiązanie symboliczne BAM!

/ d określa łącze do katalogu.

Działa w systemie Vista od razu po wyjęciu z pudełka. Można przenieść do XP.

Dokumentacja tutaj: http://technet.microsoft.com/en-us/library/cc753194%28WS.10%29.aspx

Dla tych, którzy nie są zaznajomieni z dowiązaniami symbolicznymi, jest to zasadniczo wskaźnik do innego pliku lub katalogu. Jest przezroczysty dla aplikacji. Jedna kopia na dysku, kilka sposobów rozwiązania tego problemu. Możesz także utworzyć „twarde łącze”, które nie jest wskaźnikiem do innego adresu, ale rzeczywistym wpisem identyfikatora pliku w systemie NTFS dla tego samego pliku.

UWAGA: jak stwierdzono w komentarzach, działałoby to tylko na komputerze, na którym utworzyłeś dowiązanie symboliczne i nie działałoby w systemie kontroli wersji, takim jak git.

John Vance
źródło
2
Byłoby to przydatne tylko dla jednego programisty (chyba że jest to skryptowe). Pozostałe rozwiązania stanowią część wspólnego kodu źródłowego, więc są bardziej uniwersalne.
JRoughan
Zadane pytanie nie dotyczyło współdzielonego kodu źródłowego. To powiedziawszy, msysgit nie obsługuje linków symbolicznych, więc bummer.
John Vance,
1
To nie jest kwestia systemu plików. Należy również pamiętać, że ten pomysł wywoła poważne skutki uboczne w przypadku różnych systemów kontroli źródła i systemów kopii zapasowych
g.pickardou
Najwyraźniej nie mogę edytować ani usuwać mojego pytania. Twój pierwszy zarzut jest głupi. Pytanie nie było również bezpośrednio pytaniem dotyczącym edycji pliku projektu, więc powinieneś również zanegować wszystkie te odpowiedzi. Twoje drugie zastrzeżenie zostało odnotowane i gdybym mógł zmienić swoją odpowiedź, dodając to zastrzeżenie, zrobiłbym to.
John Vance,