«Ajouter en tant que lien» pour les dossiers dans les projets Visual Studio


128

Dans Visual Studio, nous pouvons «Ajouter en tant que lien» pour ajouter un lien vers un fichier dans un autre projet de la solution.

Existe-t-il un moyen de le faire pour des dossiers entiers, de sorte qu'un dossier entier du projet A soit visible dans le projet B, sans qu'il soit nécessaire de créer un lien manuel vers de nouveaux éléments dans ce dossier?

Réponses:


142

Comme l'a indiqué cet article de blog , c'est possible.

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

Mais attention, les fichiers ne seront pas copiés.


18
+1. Vous pouvez également utiliser <Content ...>et ajouter <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>pour que Visual Studio copie les ressources lors de la génération.
Markus Jarderot

8
Essayez d'utiliser: <None>...</None>au lieu de <Compile>...</Compile>. Mais je pense qu'il copiera ces fichiers de toute façon, même VisualStudio le fait avec des fichiers liés.
mo.

4
@mo. votre réponse ajoute des liens vers tous les fichiers à la racine du projet, parfois cela n'est pas pratique. % (RecursiveDir) doit être remplacé par un nom de dossier de lien: par exemple pour lier le dossier source du projet wp7 'MyMainProject' dans un autre projet dans cette solution: <ItemGroup> <Compile Include = ".. \ .. \ MyMainProject \ MyMainProject \ engine *. * "> <Link> engine \% (FileName) </Link> </Compile> </ItemGroup>
Tertium

24
J'ai dû l'utiliser <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>pour l'empêcher de supprimer les extensions des noms de fichiers.
Joe Daley

2
Pour les ressources Icon Png: <EmbeddedResource Include = ".. \ .. \ Icons \ 16 * .png">
ChrisB

126

Dans VS2012 et versions ultérieures, vous pouvez faire glisser un dossier vers un autre projet en appuyant sur la touche Alt . C'est exactement la même chose que d'ajouter chaque fichier en tant que lien manuellement mais plus rapidement.

upd : envisagez d'utiliser des projets partagés si vous utilisez VS2013 mise à jour 2 (avec Shared Project Reference Manager ) ou VS2015.


1
Dans VS2010, cela copiera les fichiers et répertoires au lieu de les ajouter en tant que liens, créant ainsi des doublons indésirables.
Tom

3
Remarque: le dossier doit être glissé depuis l'explorateur Windows (pas une autre instance de Visual Studio). En outre, il doit s'agir d'un glissement de clic gauche, pas d'un glissement de clic droit. Fonctionne très bien dans VS2012.
davidpricedev

11
Je pense que cela crée simplement des liens vers tous les fichiers du dossier sources, pas un lien vers le dossier lui-même. Cela signifie que si vous ajoutez un fichier au dossier source, il ne sera pas automatiquement lié.
Johnny5

1
@MauryMarkowitz, vous devriez faire glisser un dossier depuis le projet VS, pas depuis l'explorateur Windows ou autre chose.
mt_serg le

1
@MauryMarkowitz, solution unique, deux projets. Faites glisser Folder1 de Project1 vers Project2 avec la touche Alt enfoncée. Chaque fichier de Project1 / Folder1 sera ajouté à Project2 / Folder1 en tant que lien.
mt_serg

37

Un ajout à la réponse de mo. et le commentaire de Marcus, si vous liez des éléments de contenu, vous devrez inclure l'extension de fichier:

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

qu'est-ce que <Compile ...c'est. Dans mon cas, je dois renvoyer des .tsfichiers à mon nouveau projet. comment c'est fait. Merci!
Rahmathullah M

23

En ce qui concerne la partie de la requête d'origine pour qu'un dossier lié apparaisse dans l'EDI, il est en quelque sorte possible d'y parvenir, il y a donc un dossier dans l'explorateur de solutions avec tous les fichiers liés à l'intérieur, au lieu de tous les fichiers apparaissant à la racine de la solution. Pour y parvenir, il faut ajouter:

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

Cela inclura tous les fichiers du répertoire lié dans un nouveau dossier de l'explorateur de solutions appelé MyData. Le 'A' dans le code ci-dessus peut être appelé n'importe quoi, mais doit être là pour que le dossier apparaisse.


cela semble faire l'affaire mais ne plie pas les fichiers Form en un seul et donne des erreurs pour leurs fichiers .resx (j'utilise VB). Merci quand même.
Ivan Ferrer Villa

1
@IvanFerrerVilla, oui il y a des problèmes que j'ai remarqués, mais pour la plupart, c'est seulement bon pour l'apparence.
Adam

3
Avec Visual Studio 2015, cela a fonctionné pour moi même sans le `A`.
Martin

7

Si vous souhaitez ajouter un dossier comme référence et que vous ne souhaitez pas le compiler, utilisez:

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

0

Sortez la coquille et ajoutez un lien symbolique.

Administrateur runas puis

mklink /d LinkToDirectory DirectoryThatIsLinkedTo

Lien symbolique BAM!

/ d spécifie le lien du répertoire.

Fonctionne sous Vista dès la sortie de la boîte. Peut être rétroporté vers XP.

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

Pour ceux qui ne sont pas familiers avec les liens symboliques, il s'agit essentiellement d'un pointeur vers un autre fichier ou répertoire. C'est transparent pour les applications. Une copie sur le disque, plusieurs façons d'y remédier. Vous pouvez également créer un "lien physique" qui n'est pas un pointeur vers une autre adresse, mais une entrée d'ID de fichier réelle en NTFS pour le même fichier.

REMARQUE: comme indiqué dans les commentaires, cela ne fonctionnerait que sur l'ordinateur sur lequel vous avez créé le lien symbolique et ne fonctionnerait pas dans un système de contrôle de version comme git.


2
Cela ne serait utile que pour un seul développeur (sauf en cas de script). Les autres solutions font partie du code source partagé et sont donc plus universellement utiles.
JRoughan

La question posée ne concernait pas le code source partagé. Cela dit, msysgit ne prend pas en charge les liens symboliques, donc dommage.
John Vance

1
Ce n'est pas une question sur le système de fichiers. Veuillez également noter que cette idée entraînera de graves effets secondaires avec différents systèmes de contrôle de source et systèmes de sauvegarde de sauvegarde
g.pickardou

Apparemment, je ne suis pas autorisé à modifier ou supprimer ma question. Votre première objection est stupide. La question n'était pas non plus explicitement une question d'édition de fichier de projet, vous devriez donc voter à la baisse pour toutes ces réponses également. Votre deuxième objection est notée, et si je pouvais modifier ma réponse pour ajouter cette mise en garde, je le ferais.
John Vance
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.