«Добавить как ссылку» для папок в проектах Visual Studio

128

В Visual Studio мы можем «Добавить как ссылку», чтобы добавить ссылку на файл в другом проекте в решении.

Есть ли способ сделать это для целых папок, чтобы вся папка в проекте A была видна в проекте B без необходимости вручную ссылаться на новые элементы в этой папке?

kpozin
источник

Ответы:

142

Как сказано в этом блоге , это возможно.

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

Но учтите, файлы копироваться не будут.

денежный перевод по почте
источник
18
+1. Вы также можете использовать <Content ...>и добавить, <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>чтобы Visual Studio скопировала ресурсы при сборке.
Маркус Жардерот
8
Попробуйте использовать: <None>...</None>вместо <Compile>...</Compile>. Но я думаю, что он все равно скопирует эти файлы. Даже VisualStudio делает это со связанными файлами.
мес.
4
@mo. Ваш ответ добавляет ссылки на все файлы в корне проекта, иногда это неудобно. % (RecursiveDir) следует изменить на какое-то имя папки ссылки: например, чтобы связать исходную папку из проекта wp7 'MyMainProject' в другом проекте в этом решении: <ItemGroup> <Compile Include = ".. \ .. \ MyMainProject \ MyMainProject \ engine *. * "> <Link> engine \% (FileName) </Link> </Compile> </ItemGroup>
Tertium
24
Мне пришлось использовать, <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>чтобы предотвратить удаление расширений из имен файлов.
Джо Дейли
2
Для ресурсов Icon Png: <EmbeddedResource Include = ".. \ .. \ Icons \ 16 * .png">
ChrisB,
126

В VS2012 и более поздних версиях вы можете перетащить папку в другой проект с нажатой клавишей alt . Это то же самое, что и добавление каждого файла в виде ссылки вручную, но быстрее.

upd : рассмотрите возможность использования общих проектов, если вы используете обновление 2 VS2013 (с диспетчером ссылок на общие проекты ) или VS2015.

mt_serg
источник
1
В VS2010 при этом будут копироваться файлы и каталоги, а не добавляться в виде ссылок, создавая нежелательные дубликаты.
Tom
3
Примечание: папку необходимо перетащить из проводника Windows (а не из другого экземпляра Visual Studio). Кроме того, это должно быть перетаскивание левой кнопкой мыши, а не правой кнопкой мыши. Отлично работает в VS2012.
davidpricedev
11
Я думаю, что он просто создает ссылки на все файлы в папке источников, а не ссылку на саму папку. Это означает, что если вы добавите файл в исходную папку, он не будет автоматически связан.
Johnny5
1
@MauryMarkowitz, вы должны перетащить папку из проекта VS, а не из проводника Windows или чего-то еще.
mt_serg
1
@MauryMarkowitz, одно решение, два проекта. Перетащите Folder1 из Project1 в Project2 с нажатой клавишей alt. Каждый файл из Project1 / Folder1 будет добавлен в Project2 / Folder1 как ссылка.
mt_serg
37

Одно дополнение к ответу от мес. и комментарий Маркуса, если вы связываете элементы контента, вам нужно будет указать расширение файла:

<ItemGroup>
  <Compile Include="any_abs_or_rel_path\**\*.*">
    <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Compile>
</ItemGroup>
Чад
источник
что это <Compile ...в этом. В моем случае мне нужно направить .tsфайлы в мой новый проект. как это сделано. Спасибо!
Rahmathullah M
23

Что касается части исходного запроса, чтобы связанная папка отображалась в среде IDE, этого можно добиться, поэтому в проводнике решений есть папка со всеми связанными файлами внутри, вместо всех файлов, появляющихся в корне решение. Для этого нужно добавить:

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

Это будет включать все файлы из связанного каталога в новую папку в проводнике решений под названием MyData. Букву «А» в приведенном выше коде можно назвать как угодно, но она должна быть там, чтобы папка появилась.

Адам
источник
Кажется, он помогает, но не складывает файлы форм в один и выдает ошибки для их файлов .resx (я использую VB). Спасибо, в любом случае.
Ivan Ferrer Villa
1
@IvanFerrerVilla, да, я заметил некоторые проблемы, но по большей части они хороши только для внешнего вида.
Адам
3
С Visual Studio 2015 у меня это сработало даже без `A`.
Мартин
7

Если вы хотите добавить папку в качестве ссылки и не хотите ее компилировать, используйте:

<Content Include="any_path\**\*.*">
  <Link>folder_in_B_project\%(RecursiveDir)%(FileName)%(Extension)</Link>
</Content>
Нешта
источник
0

Выньте оболочку и добавьте символическую ссылку.

runas Administrator, затем

mklink /d LinkToDirectory DirectoryThatIsLinkedTo

БАМ символическая ссылка!

/ d указывает ссылку на каталог.

Работает в Vista "из коробки". Может быть перенесен на XP.

Документация здесь: http://technet.microsoft.com/en-us/library/cc753194%28WS.10%29.aspx

Для тех, кто не знаком с символическими ссылками, это, по сути, указатель на другой файл или каталог. Это прозрачно для приложений. Одна копия на диске, несколько способов ее устранения. Вы также можете создать «жесткую ссылку», которая является не указателем на другой адрес, а фактической записью идентификатора файла в NTFS для того же файла.

ПРИМЕЧАНИЕ: как указано в комментариях, это будет работать только на компьютере, на котором вы создали символическую ссылку, и не будет работать в системе контроля версий, такой как git.

Джон Вэнс
источник
2
Это будет полезно только для одного разработчика (если не написано по сценарию). Другие решения являются частью общего исходного кода, поэтому они более универсальны.
JRoughan
Заданный вопрос не касался общего исходного кода. Тем не менее, msysgit не поддерживает символические ссылки, так что облом.
Джон Вэнс
1
Это не вопрос файловой системы. Также обратите внимание, что эта идея вызовет серьезные побочные эффекты с различными системами управления версиями и системами резервного копирования
g.pickardou
Очевидно, мне не разрешено редактировать или удалять свой вопрос. Ваше первое возражение глупо. Этот вопрос также не был явно вопросом редактирования файла проекта, поэтому вы также должны проголосовать против всех этих ответов. Ваше второе возражение принято к сведению, и если бы я мог отредактировать свой ответ, добавив это предостережение, я бы это сделал.
Джон Вэнс