Visual Studio Solutions文件夹为真实文件夹


119

我有一个Visual Studio解决方案。当前,这是一个空的解决方案(=没有项目),我添加了一些解决方案文件夹。

解决方案文件夹似乎只是“虚拟文件夹”,因为它们不是真正在文件系统中创建的,解决方案文件夹中的文件与.sln文件位于同一文件夹中。

我是否忽略了一个设置,该设置告诉Visual Studio将“解决方案文件夹”视为“真实”文件夹,即在文件系统中创建它们并在我将它们在解决方案中移动到其中一个文件夹时将文件移动到其中?

编辑:谢谢。然后对VS2010提出建议:)


52
这是最令人讨厌的Visual Studio怪癖之一
安迪·怀特2009年

如何正确处理此怪癖?
hellboy 2014年

有趣的是,Rider拥有此功能(但文件夹必须与.sln文件位于同一路径,并且实际的文件夹引用未存储在.sln文件本身中):jetbrains.com/help/rider/Extending_Your_Solution。 html
rsenna

我正在使用VS 2017,据我所知,MS尚未添加允许将整个文件夹添加到解决方案文件夹的功能-必须添加单个文件。
西奥,

Answers:


43

没有特殊设置。我不支持。

您可以在解决方案内的“项目”中创建实际文件夹,但不能在解决方案本身中创建。


1
这似乎仍然是准确的,因为VS 2017的
西奥

2
...和VS 2019
为何

VS最糟糕的事情之一。MS为什么不保留Sln文件夹作为选项,但还允许将REAL文件夹添加到解决方案中。很烦人。文件系统有效,为什么要重新发明轮子(作为正方形)。
MemeDeveloper

46

一种变通方法,其行为实际上与预期的一样

  1. 新的现有的网站添加到解决方案。(我通常创建一个新的。)
  2. 只要确保它是在您的解决方案文件夹中创建的。(我有时甚至创建一个指向外部文件夹的“链接”,例如网络共享上的“文档”或“市场营销”。在这种情况下,Git当然会忽略它。)
  3. 确保转到“项目”设置或配置管理器,以从“构建和部署”中排除此“网站”

做完了 现在,解决方案资源管理器将反映文件系统中的任何更改,反之亦然(包括子文件夹)。

我将它用于团队中共享的规范,文档,PM和一些DevOps脚本。很容易选择,在源代码管理中包含或不包含什么,并且(如果设置正确)与构建不冲突。

我知道该功能不适合该用例,但除了可能引起误解的“项目”图标外,我还没有发现该hack的不足之处。在某些情况下,VS提供的经典(虚拟)解决方案文件夹也很适合。你怎么看?


4
这里是完整的说明:右键单击解决方案->“添加”->“新网站...”->(我选择了“ ASP.NET空网站”)。更改位置后,别忘了在路径后附加“ \ MyName”,否则单击“确定”将简单地重新打开对话框。之后,右键单击您的解决方案->“属性”->“配置属性”->取消选中Web项目的“构建”。
user764754 '16

这个还在吗?使用VS2015,但不起作用。
Jan Paolo Go

在VS2017中,可以完美地创建一个真实的文件夹,但在解决方案资源管理器中会显示WebSite图标(黑圈)。有人知道该如何解决吗?
Andrei Karcheuski '17

是的,它可以在VS2019中使用,但仍不监视文件系统更改。您有时必须“刷新”以查看当前文件。如果只有C#项目不是唯一支持新的,更清晰的文件系统基于glob .*proj格式的解决方案类型。
香农

32

在Visual Studio 2017中,单击“解决方案资源管理器”窗口中的“解决方案和文件夹”图标。此按钮从虚拟的“解决方案”视图切换到与文件系统上的文件夹和文件的布局匹配的“源视图”。当您添加新文件夹时,该文件夹将在预期的位置物理创建。 解决方案和文件夹


这很有用,但是在“源代码视图”中,您丢失了项目上的所有右键单击快捷方式,即“ Manage NuGet Packages”。
大卫·梁

1
为什么只有C ++解决方案或项目的行为与其他语言相比有所不同?
友好的幽灵

这对我有所帮助,因此我在需要的文件夹视图中创建了一个文件夹,然后添加了一个解决方案文件夹并将该项目添加为该文件夹的子级。对我来说真的没有意义,但是这个答案帮助我
hanzolo

这正是我想要的。谢谢!
user1633272

10

选择的答案表明可以使用实际项目而不是解决方案文件夹,但实际上并没有解释如何使用。我想我在这里描述的可能是实现该目标的最尴尬的方式... :-P

常规项目文件的问题在于它们最终将由编译MSBUILD。而且,如果您想要一个仅包含不可编译文件的项目,那是一个问题。

但是一段时间前,Visual Studio引入了一种新的项目类型:共享项目(扩展名为.shproj)。默认情况下,不会编译此项目类型,而仅在(且仅当)另一个项目引用该项目类型时才进行编译。

因此,这里技巧的一部分是使用共享项目而不是解决方案文件夹。很明显,可以添加一个从未被任何其他项目引用的共享项目,这意味着我们可以避免上面提到的问题。

然后,通过使用<None Include="**/*" />.shproj文件中的子句,我们可以使其自动反映所有新文件和/或子文件夹。

所以基本上做到这一点:

  • 在您的解决方案中创建一个新文件夹。
  • 在此新文件夹的根目录下添加一个新的.shproj文件。
  • 在您的解决方案中引用新的.shproj。

例如,以我为例,我创建了一个DockerDev.shproj,因此我可以将一些仅在开发机器中运行的与Docker相关的脚本分组:

<?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所要求的非常相似:它将作为对文件夹的不可编译的引用工作,并且将自动反映对其所做的任何更改。


以我的经验,一旦毫不知情的团队成员接触到任​​何文件属性,这便会堆积如山。之后,导航窗格中将出现重复的文件。在某些情况下,每个文件最终都会在.proj文件中枚举,然后出现丑陋的情况。尽管我不喜欢放弃,但我仍然更喜欢“添加现有网站”方法。
香农

@shannon我从未经历过您提到的行为,但是“缺少证据并不意味着缺乏证据”,就是这样。但是我每天都使用共享项目,所以我认为这也很重要。关于网站项目(WSP),我猜很长时间以来,它们也可以工作。
rsenna's

8

萨拉·福特(Sara Ford)贡献了一个宏来完成这项工作。在Visual Studio 2010中,如果打开宏资源管理器,则会看到一个名为“ GenerateSlnFolderOnDirStructure”的宏。这将自动创建解决方案文件夹并添加文件。


5

文件夹到解决方案文件夹通过CeciliaWirén-CeciliaSHARP

消除了将多个文件添加到解决方案文件夹的麻烦。只需使用解决方案的上下文菜单,然后在创建新解决方案文件夹的选项下面,您会发现“将文件夹添加为解决方案文件夹”。这将创建一个与您选择的名称相同的解决方案文件夹,并将该文件夹内的项目添加到解决方案文件夹。这不会移动磁盘上的文件。


3

不,不支持。正如您所怀疑的那样,解决方案文件夹只是.sln文件中的虚拟子条目,与文件系统无关。


3

Visual Studio不对此提供支持。我做了一个扩展,尽管它对VS2013做类似的事情。尽管映射是一种方式(从硬盘驱动器到解决方案),但它会将解决方案文件夹映射到硬盘驱动器上的物理文件夹。这意味着解决方案文件夹的内容将反映硬盘驱动器文件夹的内容,而不是其他方式。

顺便说一句,扩展可能仍然有用。它支持将解决方案文件夹映射到物理文件夹,基于正则表达式过滤文件和目录以及记住.sln文件中的映射。属性是非侵入性的,因此没有扩展名的开发人员仍然可以打开sln且不受影响。

托管在Visual Studio画廊上:https : //visualstudiogallery.msdn.microsoft.com/69e19ea6-4442-4cb6-b​​300-044dd21f02bd

编辑:上传到bitbucket。现在开源。MIT许可证。https://bitbucket.org/LSS_NorthWind/physical-solution-folders


3

注意:是的,您可以在root上创建一个文件夹,但是它的作用有点棘手...。

通过付出额外的努力,您可以做到如何?让我们按照以下步骤操作:

  • 1- 在根目录(.sln文件所在的目录)上创建文件夹,例如:“ newfolder ”。
  • 2.将项目复制并粘贴到文件夹中。
  • 3.转到您的sln文件,找到移动的项目并将newfolder \附加到移动的项目的地址中。
  • 4.保存sln文件。
  • 5,打开项目并在git左右提交存储库...
  • 6.将存储库放在新位置。

    你完成了...

如果仍然看不到您的文件夹-----

  • 1.添加解决方案文件夹xyz。
  • 2.打开sln文件,然后使用您的文件夹名称更改该文件夹名称。

恭喜您完成了。

如果您遇到任何问题,请写信给我。


3

创建“解决方案文件夹”。这将创建逻辑文件夹,但不会创建物理文件夹。右键单击解决方案文件夹,然后打开一个新的项目对话框。但是在单击“确定”之前,您必须将项目位置更改为所需的物理文件夹,VS会创建它并将其放置在其中。


1

您可以通过为Visual Studio项目文件选择“添加新过滤器”来添加真实文件夹。您也可以在现有文件夹下执行“添加新过滤器”。创建文件夹后,对其进行重命名并添加源文件或头文件,或者添加适合您项目的文件。我知道这是一种让我们通过Visual Studio IDE创建真实文件夹的方法。


此功能特定于C ++项目。
塔米尔·丹尼尔

此解决方案也适用于VS项目-问题是关于“解决方案”级别的文件夹。
西奥,

0

如上所述,在解决方案下创建的文件夹将是虚拟的。也许这可以称为解决方法,但是您可以在添加新项/项目之前或之时在磁盘上物理创建文件夹,Robert应该是您父亲的兄弟。

附:-仔细看看,也许我应该解释“鲍勃是你的叔叔”的意思是你的好/排序。


罗伯特是你母亲的兄弟有关系吗?
Darrel Lee

0

我本人曾几次希望使用此功能,但是最终,您真的希望具有此功能。将解决方案(文件)视为Web应用程序的根,将解决方案文件夹视为虚拟目录(从字面上和功能上)。Web虚拟目录的内容可能在物理上完全位于其他服务器上。Visual Studio混淆了解决方案文件夹概念的地方是允许您在文件夹内创建新文件。您应该始终“添加现有内容”添加内容时,内容”。添加现有文件时,它会创建一个指向文件源位置的链接。

但是,由于您不希望解决方案文件夹表现得像“物理”文件夹那样,是因为您的解决方案布局不一定使用与源代码管理布局相同的约定。解决方案文件夹允许您自定义项目的层次结构,以便您可以按自己喜欢的方式将项目和项目组合在一起,然后确定自己不喜欢并再次进行更改,而不必经历移动源代码管理项目的噩梦到处打扰您团队的其他成员。


1
这是正确的答案-在磁盘上与虚拟文件夹同名的文件夹中创建文件,然后使用“添加现有文件”在VS中添加文件。
理查德(Richard)

4
他们本可以轻松实现虚拟和物理文件夹。显然这是一个忽视。参见参考资料:其他所有IDE。
塔米尔·丹尼尔

6
我根本不理解为什么(IIS)虚拟目录的概念与解决方案文件夹有关。至于源代码控制参数,我看不到问题。为什么文件移动会激怒整个团队?这是常见的操作。为什么要让源代码管理中的文件布局与物理布局不同?
user247702'1

2
物理解决方案的文件夹会更容易(虽然只是一个位)打造摩登的文件夹结构类似NancyFx的,在多个项目分为类别,如srctesttools,等你肯定会想使在项目一开始就认为决定你对点激怒团队,但这在大多数架构决策中都是如此。
埃里克·埃斯基尔德森

3
-1我的用例是这样的:有时我们只想向解决方案中添加某些文档。它们不会被构建,但是会保留在源代码管理中。我们通常为他们提供一个特殊的文件夹。我想有文件夹在我的解决方案-而不是它包含的文件,但文件夹本身。是的,有许多方法可以绕过此限制,但不是最佳方法。在解决方案中具有对文件夹的实际引用将可以正常工作。
rsenna

0

我对此有一些解决方法(虽然不好,但是可以用)。

  1. 在您的解决方案中创建一个文件夹(即“ Contoso”)
  2. 右键单击解决方案,然后单击“在解决方案资源管理器中打开文件夹”
  3. 在解决方案目录中创建物理文件夹(即“ Contoso”)
  4. 在物理文件夹中复制/创建文件。
  5. 将文件拖到解决方案资源管理器中的虚拟文件夹中。

这不是很好,因为您将需要手动维护文件引用,但是对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.