Папка решений Visual Studio как настоящие папки

122

У меня есть решение Visual Studio. В настоящее время это пустое решение (= нет проектов), и я добавил несколько папок с решениями.

Папки решений только кажутся «виртуальными папками», потому что они на самом деле не создаются в файловой системе, а файлы внутри папок решений просто находятся в той же папке, что и файл .sln.

Есть ли параметр, который я пропустил, который указывает Visual Studio рассматривать папки решений как «настоящие» папки, то есть создавать их в файловой системе и перемещать в нее файлы, когда я перемещаю их внутри решения в одну из этих папок?

Изменить: Спасибо. Тогда собираюсь сделать предложение для VS2010 :)

Майкл Штум
источник
52
Это одна из самых раздражающих причуд Visual Studio
Энди Уайт
Как правильно разобраться с этой причудой?
hellboy
Забавно, у Rider есть такая функция (но папка должна находиться по тому же пути, что и файл .sln, а фактическая ссылка на папку не сохраняется в самом файле .sln): jetbrains.com/help/rider/Exnding_Your_Solution. html
rsenna
Я использую VS 2017, и, насколько я могу судить, MS еще не добавила функцию, позволяющую добавлять целые папки в папку решения - необходимо добавлять отдельные файлы.
Тео

Ответы:

42

Никакой специальной настройки. Я не думаю, что это поддерживается.

Вы можете создавать настоящие папки в «проекте» внутри решения, но не в самом решении.

svlists
источник
1
Это все еще кажется точным по состоянию на VS 2017.
Тео
2
... и VS 2019
whymatter
одна из худших вещей в VS. Почему бы MS не сохранить папки Sln в качестве опции, но ТАКЖЕ разрешить добавление РЕАЛЬНЫХ папок в решение. Так раздражает. Файловая система работает, зачем изобретать велосипед (в виде квадрата).
MemeDeveloper,
46

Есть обходной путь, который на самом деле ведет себя так, как ожидалось .

  1. Добавьте в решение новый или существующий веб-сайт . (Обычно я создаю новый.)
  2. Просто убедитесь, что он создан в папке вашего решения. (Иногда я даже создаю «ссылку» на внешнюю папку, например «Документы» или «Маркетинг» в общей сетевой папке. В этом случае, конечно, Git игнорирует ее.)
  3. Обязательно зайдите в настройки «Project» или Configuration Manager, чтобы исключить этот «веб-сайт» из сборки и развертывания !

Готово. Теперь обозреватель решений будет отражать любые изменения в файловой системе и наоборот (включая подпапки).

Я (скучаю) использую его для спецификаций, документации, PM и некоторых сценариев DevOps, которые используются в команде. Легко выбрать, что включать в систему контроля версий или нет, и (при правильной настройке) это не конфликтует со сборкой.

Я знаю, что эта функция не предназначена для этого варианта использования, но, за исключением, возможно, вводящего в заблуждение значка «Проект», я пока не обнаружил недостатков в этом взломе. И все же есть случаи использования, когда классические (виртуальные) папки решений, которые предоставляет VS, вписываются в картину. Что вы думаете?

Майкл
источник
4
Вот полные инструкции: Щелкните решение правой кнопкой мыши -> «Добавить» -> «Новый веб-сайт ...» -> (я выбрал «Пустой веб-сайт ASP.NET»). После изменения местоположения не забудьте добавить к пути «\ MyName», иначе нажатие «OK» просто повторно откроет диалоговое окно. После этого щелкните правой кнопкой мыши свое решение -> «Свойства» -> «Свойства конфигурации» -> снимите флажок «Сборка» для веб-проекта.
user764754
Это все еще работает? используя VS2015, но это не работает.
Ян Паоло Го
В VS2017 отлично создается настоящая папка, но значок веб-сайта (темный кружок) отображается в обозревателе решений. Кто-нибудь знает, как это исправить?
Андрей Качевский
Да, он работает в VS2019, но по-прежнему не отслеживает изменения файловой системы. Вы должны время от времени «Обновить», чтобы увидеть текущие файлы. Если бы только проекты C # не были единственным типом решения, поддерживающим новый, более чистый и понятный .*projформат файловой системы на основе глобуса.
Shannon
34

В Visual Studio 2017 щелкните значок «Решения и папки» в окне обозревателя решений. Эта кнопка переключает из виртуального представления «решения» в «исходное представление», которое соответствует макету папок и файлов в файловой системе. Когда вы добавляете новую папку, она физически создается в ожидаемом месте. решения и папки,

OdeToCode
источник
1
Это полезно, но в «исходном виде» вы потеряли все ярлыки, вызываемые правой кнопкой мыши в проекте, то есть «Управление пакетами NuGet».
Дэвид Лян
1
Почему только решения или проекты C ++ ведут себя иначе по сравнению с другими языками?
Friendly Ghost
2
Это помогло мне, поэтому я создал папку в представлении папки, где я хотел, затем я добавил папку решения и добавил проект в качестве дочернего элемента папки. Для меня это не имеет смысла, но этот ответ помог мне
понять
1
Это именно то, что я хочу. Спасибо!
user1633272
10

Выбранный ответ предполагает, что можно было бы использовать реальные проекты вместо папок решений, но не объясняет, как это сделать. Думаю, то, что я здесь описываю, возможно, наименее неудобный способ добиться этого ... :-P

Проблема с обычными файлами проекта заключается в том, что они в конечном итоге будут скомпилированы MSBUILD. И если вы хотите иметь проект, который содержит только некомпилируемые файлы, это будет проблемой.

Но некоторое время назад Visual Studio представила новый тип проекта: Shared Project (расширение .shproj). Этот тип проекта не компилируется по умолчанию, а только тогда (и только если) на него ссылается другой проект.

Таким образом, одна из хитростей заключается в использовании общих проектов вместо папок решений . Очевидно, что можно добавить общий проект, на который никогда не ссылается какой-либо другой проект, что означает, что мы можем избежать проблемы, представленной выше.

Затем, используя <None Include="**/*" />предложение в файле .shproj, мы можем заставить его автоматически отражать любые новые файлы и / или подпапки.

Итак, в основном сделайте это:

  • Создайте новую папку в своем решении.
  • Добавьте новый файл .shproj в корень этой новой папки.
  • Ссылайтесь на новый .shproj в своем решении.

Например, в моем случае я создал DockerDev.shproj, поэтому я могу сгруппировать некоторые сценарии, связанные с докерами, которые мы запускаем только на наших машинах для разработки:

<?xml version="1.0" encoding="utf-8"?>
<!-- DockerDev/DockerDev.shproj -->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="**/*" />
  </ItemGroup>
</Project>

Этот файл .shproj будет отслеживать любой файл в любой подпапке этой новой DockerDevпапки в моем решении.

Насколько я мог видеть, это решение работает очень похоже на то, что запрашивал OP: оно будет работать как некомпилируемая ссылка на папку и автоматически будет отражать любые внесенные в нее изменения.

rsenna
источник
По моему опыту, это накапливается беспорядок, как только ничего не подозревающий член команды касается каких-либо свойств файла; после чего на панели навигации появляются дублирующиеся файлы. При некоторых условиях каждый файл в конечном итоге перечисляется в файле .proj, и тогда возникает уродство. Хотя мне не нравится сдаваться, я все же предпочитаю подход «Добавить существующий веб-сайт».
Shannon
@shannon Я никогда не испытывал того поведения, о котором вы говорите, но «отсутствие доказательств не является доказательством отсутствия», так что вот оно. Но я использую общие проекты ежедневно, поэтому думаю, что это тоже имеет значение. Что касается проектов веб-сайтов (WSP), они тоже могут работать, я думаю, я уже давно не использую их.
rsenna 06
8

Сара Форд добавила макрос, чтобы сделать это. В Visual Studio 2010, если вы откроете Macro Explorer, вы увидите макрос под названием «GenerateSlnFolderOnDirStructure». Это автоматизирует создание папок решений и добавление файлов.

SwampyFox
источник
6

Папка в папку решения Сесилии Вирен - CeciliaSHARP

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

Райана
источник
3

Нет, не поддерживается. Как вы и подозревали, папки решений - это просто виртуальные подстатьи в файле .sln, не имеющие ничего общего с файловой системой.

Алан
источник
3

Visual Studio не поддерживает это. Я сделал расширение, которое делает что-то подобное для VS2013. Он сопоставляет папки решения с физическими папками на вашем жестком диске, хотя сопоставление является односторонним (от жесткого диска к решению). Это означает, что содержимое папки решения будет отражать содержимое папки жесткого диска, а не наоборот.

После этого расширение все еще может быть полезно. Он поддерживает сопоставление папок решения с физическими папками, фильтрацию файлов и каталогов на основе регулярного выражения и запоминание сопоставлений в вашем файле .sln. Свойства ненавязчивы, поэтому разработчики без расширения могут открыть sln и не пострадают.

Размещено в галерее Visual Studio: https://visualstudiogallery.msdn.microsoft.com/69e19ea6-4442-4cb6-b300-044dd21f02bd

Изменить: загружено в битбакет. Теперь с открытым исходным кодом. Лицензия MIT. https://bitbucket.org/LSS_NorthWind/physical-solution-folders

Северный ветер
источник
3

Примечание: Да, это возможно, вы можете создать папку в корневом каталоге, но это немного сложно ....

Приложив дополнительные усилия, вы можете это сделать. Как? Давайте следовать за шагом -

  • 1-Создать папку, например: « новая папка » в корне (где находится ваш .sln файл).
  • 2. Скопируйте и вставьте свои проекты в папку.
  • 3. перейдите в свой файл sln, найдите перемещенные проекты и добавьте новую папку \ в адрес перемещенного проекта.
  • 4. Сохраните файл sln.
  • 5.Откройте свой проект и зафиксируйте репозиторий в git или около того ...
  • 6. Перенести репозиторий на новое место.

    Вы сделали...

если вы по-прежнему не видите свою папку -----

  • 1. Добавьте папку решения xyz.
  • 2. Откройте файл sln и измените имя папки на имя вашей папки.

Поздравляю, вы закончили ..

Если у вас возникнут проблемы, просто напишите мне о помощи ..

Анкит
источник
3

Создайте «Папку решения». Это создаст логическую папку, но не физическую. Щелкните правой кнопкой мыши папку решения и откройте диалоговое окно нового проекта. Но прежде чем вы нажмете ОК, вам нужно изменить местоположение проекта на желаемую физическую папку, и VS создаст ее и поместит проект внутрь.

RC21
источник
1

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

Абхиджит К Рао
источник
Эта функция характерна для проектов C ++.
Тамир Даниели
Это решение также применимо к проектам VS - речь идет о папках уровня решения.
Тео
0

Папка, созданная под решением, будет виртуальной, как сказано. Возможно, это можно было бы назвать обходным путем, но вы можете физически создать папку на диске либо до, либо при добавлении нового элемента / проекта, и Роберт должен быть родным братом вашего отца.

ps - при внимательном рассмотрении, может быть, мне стоит объяснить "Боб твой дядя" означает, что ты в порядке / отсортирован.

голубь
источник
Имеет ли значение, брат ли Роберт твоей матери?
Даррел Ли
0

Я сам хотел эту функцию несколько раз, но, в конце концов, вам действительно НЕ нужна возможность делать это. Думайте о своем решении (файле) как о корне веб-приложения, а папки решений как о виртуальных каталогах (буквально и функционально). Содержимое виртуального веб-каталога может физически находиться на другом сервере. Visual Studio запутала концепцию папок решений, позволив вам создавать новые файлы внутри папки. Вы всегда должны «Добавить существующее» при добавлении контента. Когда вы добавляете существующий, он создает ссылку на исходное расположение файла.

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

Пол Истер
источник
1
Это правильный ответ - создайте файл на диске в папке с тем же именем, что и виртуальная папка, затем добавьте файл в VS, используя «Добавить существующий».
Ричард
4
Они могли легко реализовать как виртуальные, так и физические папки. Это явно упущение. См. Ссылку: любая другая IDE, когда-либо.
Тамир Даниели
6
Я вообще не понимаю, почему концепция виртуальных каталогов (IIS) имеет какое-либо отношение к папкам решений. Что касается аргумента управления версиями, я не вижу проблемы. Почему перемещение файлов раздражает остальную команду? Это обычная операция. И почему вы хотите, чтобы макет файлов в системе управления версиями отличался от физического макета?
user247702
2
Физические папки решения облегчат (хотя только немного) , чтобы создать современные структуры папок , как NancyFx - х , где несколько проектов попадают в категорию , такие как src, test, toolsи т.д. Вы бы определенно хотите , чтобы принять это решение в самом начале проекта до точки о раздражает команду, но это верно для большинства архитектурных решений.
Эрик
3
-1 Мой пример использования такой: иногда мы просто хотим добавить в решение определенные документы. Они не будут построены, но хранятся в системе контроля версий. Обычно для них есть специальная папка. Я бы хотел, чтобы в моем решении была эта папка - не файлы, которые она содержит, а сама папка. Да, есть способы обойти это ограничение, но они не оптимальны. Ссылка на папку в решении просто сработает.
rsenna
0

У меня есть способ обойти это (не очень хорошо, но работает).

  1. Создайте папку в своем решении (например, «Contoso»).
  2. Щелкните решение правой кнопкой мыши и выберите «Открыть папку в обозревателе решений».
  3. Создайте физическую папку (например, «Contoso») в каталоге решения.
  4. Скопируйте / создайте файлы в физической папке.
  5. Перетащите файлы в виртуальную папку в обозревателе решений.

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

Мэтью Лейтон
источник