"Als Link hinzufügen" für Ordner in Visual Studio-Projekten


127

In Visual Studio können Sie "Als Link hinzufügen" einen Link zu einer Datei in einem anderen Projekt in der Lösung hinzufügen.

Gibt es eine Möglichkeit, dies für ganze Ordner zu tun, sodass ein ganzer Ordner in Projekt A in Projekt B sichtbar ist, ohne dass manuell auf neue Elemente in diesem Ordner verwiesen werden muss?

Antworten:


140

Wie dieser Blogpost sagte, ist es möglich.

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

Beachten Sie jedoch, dass die Dateien nicht kopiert werden.


18
+1. Sie können Visual Studio auch verwenden <Content ...>und hinzufügen <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>, damit die Ressourcen beim Erstellen kopiert werden.
Markus Jarderot

8
Versuchen Sie: <None>...</None>anstelle von <Compile>...</Compile>. Aber ich denke, es wird diese Dateien trotzdem kopieren. Selbst VisualStudio macht dies mit verknüpften Dateien.
mo.

4
@mo. Ihre Antwort fügt Links zu allen Dateien im Projektstamm hinzu. Manchmal ist dies unpraktisch. % (RecursiveDir) sollte in einen Linkordner geändert werden: Zum Beispiel, um den Quellordner aus dem wp7-Projekt 'MyMainProject' in einem anderen Projekt in dieser Lösung zu verknüpfen: <ItemGroup> <Compile Include = ".. \ .. \ MyMainProject \ MyMainProject \ engine *. * "> <Link> engine \% (FileName) </ Link> </ Compile> </ ItemGroup>
Tertium

23
Ich musste verwenden <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>, um zu verhindern, dass die Erweiterungen aus den Dateinamen entfernt wurden.
Joe Daley

2
Für Icon Png-Ressourcen: <EmbeddedResource Include = ".. \ .. \ Icons \ 16 * .png">
ChrisB

126

In VS2012 und höher können Sie einen Ordner mit alt in ein anderes Projekt ziehen gedrückter Taste . Es ist genauso, als würde man jede Datei manuell als Link hinzufügen, aber schneller.

upd : Verwenden Sie gemeinsam genutzte Projekte, wenn Sie VS2013 Update 2 (mit Shared Project Reference Manager ) oder VS2015 verwenden.


1
In VS2010 werden dabei Dateien und Verzeichnisse kopiert, anstatt sie als Links hinzuzufügen, wodurch unerwünschte Duplikate erstellt werden.
Tom

3
Hinweis: Der Ordner muss aus dem Windows Explorer gezogen werden (keine andere Instanz von Visual Studio). Es muss sich auch um ein Ziehen mit der linken Maustaste handeln, nicht um ein Ziehen mit der rechten Maustaste. Funktioniert hervorragend in VS2012.
Davidpricedev

11
Ich denke, es werden nur Links zu allen Dateien im Quellordner erstellt, kein Link zum Ordner selbst. Das heißt, wenn Sie dem Quellordner eine Datei hinzufügen, wird diese nicht automatisch verknüpft.
Johnny5

1
@MauryMarkowitz, Sie sollten einen Ordner aus dem VS-Projekt ziehen, nicht aus dem Windows Explorer oder etwas anderem.
mt_serg

1
@MauryMarkowitz, Einzellösung, zwei Projekte. Ziehen Sie Ordner1 mit gedrückter Alt-Taste von Projekt1 nach Projekt2. Jede Datei aus Projekt1 / Ordner1 wird als Link zu Projekt2 / Ordner1 hinzugefügt.
mt_serg

37

Eine Ergänzung zur Antwort von mo. und der Kommentar von Marcus: Wenn Sie Inhaltselemente verknüpfen, müssen Sie die Dateierweiterung einschließen:

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

Was ist das <Compile ...in diesem. In meinem Fall muss ich .tsDateien auf mein neues Projekt verweisen . wie es gemacht wird. Vielen Dank!
Rahmathullah M

23

In Bezug auf den Teil der ursprünglichen Abfrage, in dem ein verknüpfter Ordner in der IDE angezeigt werden soll, ist dies möglich. Daher befindet sich im Lösungs-Explorer ein Ordner mit allen verknüpften Dateien anstelle aller Dateien im Stammverzeichnis von die Lösung. Um dies zu erreichen, fügen Sie hinzu:

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

Dies schließt alle Dateien aus dem verknüpften Verzeichnis in einem neuen Ordner im Lösungs-Explorer namens MyData ein. Das 'A' im obigen Code kann beliebig genannt werden, muss aber vorhanden sein, damit der Ordner angezeigt wird.


Es scheint den Trick zu tun, faltet aber Form-Dateien nicht zu einer und gibt Fehler für ihre .resx-Dateien (ich verwende VB). Danke trotzdem.
Ivan Ferrer Villa

1
@IvanFerrerVilla, ja, es hat einige Probleme, die ich bemerkt habe, aber zum größten Teil ist nur gut für das Aussehen.
Adam

3
Mit Visual Studio 2015 funktionierte dies bei mir auch ohne das "A".
Martin

7

Wenn Sie einen Ordner als Referenz hinzufügen und nicht kompilieren möchten, verwenden Sie:

<Content Include="any_path\**\*.*">
  <Link>folder_in_B_project\%(RecursiveDir)%(FileName)%(Extension)</Link>
</Content>

0

Sprengen Sie die Shell aus und fügen Sie einen symbolischen Link hinzu.

runas Administrator dann

mklink /d LinkToDirectory DirectoryThatIsLinkedTo

BAM symbolischer Link!

/ d gibt die Verzeichnisverknüpfung an.

Funktioniert in Vista sofort. Kann auf XP zurückportiert werden.

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

Für diejenigen, die mit symbolischen Links nicht vertraut sind, ist es im Wesentlichen ein Zeiger auf eine andere Datei oder ein anderes Verzeichnis. Es ist für Anwendungen transparent. Eine Kopie auf der Festplatte, verschiedene Möglichkeiten, sie zu adressieren. Sie können auch einen "festen Link" erstellen, der kein Zeiger auf eine andere Adresse ist, sondern ein tatsächlicher Datei-ID-Eintrag in NTFS für dieselbe Datei.

HINWEIS: Wie in den Kommentaren angegeben, funktioniert dies nur auf dem Computer, auf dem Sie den Symlink erstellt haben, und nicht in einem Versionskontrollsystem wie git.


2
Dies wäre nur für einen einzelnen Entwickler nützlich (sofern kein Skript erstellt wurde). Die anderen Lösungen sind Teil des gemeinsam genutzten Quellcodes und daher universeller einsetzbar.
JRoughan

Bei der gestellten Frage ging es nicht um gemeinsam genutzten Quellcode. Das heißt, msysgit unterstützt keine Symlinks, also Mist.
John Vance

1
Dies ist keine Dateisystemfrage. Bitte beachten Sie auch, dass diese Idee schwerwiegende Nebenwirkungen bei verschiedenen Versionsverwaltungssystemen und Backup-Resore-Systemen
hervorruft

Anscheinend darf ich meine Frage nicht bearbeiten oder löschen. Ihr erster Einwand ist dumm. Die Frage war auch nicht explizit eine Frage zur Bearbeitung von Projektdateien, daher sollten Sie auch alle diese Antworten ablehnen. Ihr zweiter Einwand wird zur Kenntnis genommen, und wenn ich meine Antwort bearbeiten könnte, um diese Einschränkung hinzuzufügen, würde ich dies tun.
John Vance
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.