Visual Studio解决方案文件夹作为实际文件夹。

178

我有一个 Visual Studio 解决方案。目前,它是一个空解决方案(即没有项目),我已经添加了一些解决方案文件夹。

解决方案文件夹似乎只是“虚拟文件夹”,因为它们并没有真正地在文件系统中创建,而解决方案文件夹中的文件只是坐落在与 .sln 文件相同的文件夹中。

是否有一个设置被忽视了,可以告诉 Visual Studio 将解决方案文件夹视为“真实”文件夹,也就是说,在我将文件移动到这些文件夹中的一个时,它会在文件系统中创建该文件夹并将文件移到其中?

编辑:谢谢。接下来我将为 VS2010 提出建议 :)


106
这是Visual Studio中最烦人的怪癖之一。 - Andy White
我该如何正确处理这个怪癖? - hellboy
有趣的是,Rider 有这个功能(但文件夹必须与 .sln 文件在同一路径下,并且实际文件夹引用未存储在 .sln 文件本身中):https://www.jetbrains.com/help/rider/Extending_Your_Solution.html - rsenna
1
我正在使用VS 2017,据我所知,微软尚未添加一项功能,允许将整个文件夹添加到解决方案文件夹中 - 只能添加单个文件。 - Theo
19个回答

57

一个解决方法,可以按预期运行

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

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

我滥用它来做规格、文档、PM 和一些 DevOps 脚本,这些都是在团队内共享的。可以轻松选择要包含在源代码控制中还是不包含,并且(如果正确设置)它不会与构建冲突。

我知道这个功能不是为那种用例而设计的,但除了可能误导人的“项目”图标外,我还没有发现任何缺点。仍然存在传统(虚拟)解决方案文件夹适用于 VS 提供的情况。你怎么看?


4
以下是完整的指令:右键点击解决方案 -> "添加" -> "新建网站..." ->(我选择了“ASP.NET空白网站”)。更改位置后不要忘记在路径末尾添加"\MyName",否则单击“确定”将只会重新打开对话框。然后右键点击解决方案 -> "属性" -> "配置属性" -> 取消勾选网络项目的“生成”。 - user764754
这还能用吗?我用VS2015,但它不起作用。 - Jan Paolo Go
在VS2017中,可以完美地创建一个真实的文件夹,但是在解决方案资源管理器中显示的却是WebSite图标(黑色圆圈)。有人知道如何修复这个问题吗? - Andrei Karcheuski
是的,在VS2019中可以工作,但仍无法监视文件系统更改。您必须偶尔“刷新”才能查看当前文件。如果只有C#项目不是唯一支持新的、更清洁、更清晰的基于文件系统通配符的 .*proj 格式的解决方案类型就好了。 - shannon

56

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

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


4
截至VS 2017,这仍然是准确的。 - Theo
13
...和VS 2019 - whymatter
17
关于VS最糟糕的事情之一是,为什么微软不将Sln文件夹作为选项保留,同时允许向解决方案中添加真正的文件夹。这很烦人。文件系统已经可用,为什么要重新发明轮子(变成方轮)。 - MemeDeveloper
2
您可以更改项目的行为:https://dev59.com/Q3VC5IYBdhLWcg3whRgw#66004927 - Rub
11
...和VS 2022 - - Matthew Watson

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

3
这很有用,但在“源代码视图”中,你会失去项目上的所有右键快捷方式,如“管理 NuGet 包”。 - David Liang
2
为什么只有C++的解决方案或项目与其他语言不同? - Friendly Ghost
5
这个答案帮到了我,所以我在文件夹视图中创建了一个文件夹,然后添加了一个解决方案文件夹,并将项目作为该文件夹的子项添加进去。虽然对我来说并不是很清晰,但这个答案确实帮助了我。 - hanzolo
3
这正是我想要的。谢谢! - user1633272

15

所选答案建议使用实际项目代替解决方案文件夹,但并未真正解释如何做到。我猜我在这里描述的可能是实现这一点的最不尴尬的方式... :-P

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

但是,不久前,Visual Studio引入了一种新的项目类型:共享项目(.shproj扩展名)。该项目类型默认情况下不会被编译,只有在被另一个项目引用时(且仅当它被引用时)才会被编译。

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

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

因此,基本上是这样做的:

  • 在解决方案中创建一个新文件夹。
  • 在此新文件夹的根目录下添加一个新的.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 请求的那样工作:它将作为指向文件夹的不可编译引用,并自动反映其中进行的任何更改。


1
根据我的经验,只要一个不知情的团队成员触碰了任何文件属性,就会积累垃圾文件;之后你会发现导航窗格中出现了重复的文件。在某些情况下,每个文件最终都会在.proj文件中被枚举,然后就会出现丑陋的情况。虽然我不喜欢放弃,但我仍然更喜欢“添加现有网站”的方法。 - shannon
@shannon,我从未遇到过你提到的行为,但“缺乏证据并不意味着证据不存在”,所以有这个。但是我每天都使用共享项目,所以我认为那也算数。关于Web Site Projects(WSP),它们也可以工作,我猜,我已经很久没有使用它了。 - rsenna
1
这很方便。我尝试添加了一个共享项目,结果成功了。我的是用来运行不起来的SQL脚本的。 - Paul McCarthy
1
这很方便。我尝试添加了一个共享项目,结果很好。我的项目是用于 SQL 脚本,但代码无法运行。 - undefined
1
是的 @PaulMcCarthy,四年过去了,我仍然认为这是最好的方法。而且,我从来没有遇到任何“重复文件”的问题,所以我不确定Shannon的问题是什么(或者是否真的与这个解决方案有关)。 - rsenna

10

您只需要将新的解决方案文件夹的嵌套级别和名称与实际文件系统文件夹同步,就可以完美运行!

现有项目:

  • 创建实际文件夹
  • 创建具有完全相同名称的解决方案文件夹
  • 将项目文件夹复制到新文件夹中(实际文件系统)
  • (在解决方案资源管理器中) - 单击同一文件夹上的右键
  • 添加 => 现有项目

添加新项目:

  • 创建您的解决方案文件夹
  • (在解决方案上右键单击) => 添加新项目
  • 更改要添加的项目名称下的位置地址,以便与解决方案文件夹中的精确地址相同

“将您的项目放入其中”,您是指“将包含文件的项目文件夹放入您刚在文件系统中创建的'实际文件夹'中”吗? - GrantRobertson
2
@GrantRobertson 我做了一些编辑。希望有所帮助。 - Armin Torkashvand
2
我可以确认这在VS2019中有效!那些经常改变文件夹结构的人经常遇到这个问题。我希望它能更容易一些。请注意,如果您已经将项目放入源代码控制中,那么在此之后进行检查时需要做更多的工作。 - Angelo
@Angelo 没错,而且所有文件都成为源代码控制的第一个版本。 - Armin Torkashvand
我按照现有文件夹的步骤操作了一下,完美地解决了问题。谢谢! - Amit .NET

8

Sara Ford贡献了一种宏来实现此操作。在Visual Studio 2010中,如果您打开宏资源管理器,您将看到一个名为“GenerateSlnFolderOnDirStructure”的宏。这将自动创建解决方案文件夹并添加文件。


7

Cecilia Wirén - CeciliaSHARP的“将文件夹转换为解决方案文件夹”

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


6

对于Visual Studio 2019中的C#,我使用了这种方法(看起来类似于这个答案,但至少在C#解决方案中不起作用

  1. 在“解决方案资源管理器”中点击 切换视图

enter image description here

  1. 选择 文件夹视图

enter image description here

  1. 您可以将单独的文件夹添加到解决方案中

enter image description here

  1. 要回到常规的解决方案资源管理器视图,只需再次单击“切换视图”,然后选择解决方案。

使用此方法似乎存在限制(来自@montonero的评论):

...只需打开一个具有多个项目的解决方案,并尝试通过文件夹视图将项目移动到其他实际文件夹中。问题是VS不会更新解决方案文件中项目的路径


我不确定这是否是新的VS 2019功能,但它确实提供了我所需的功能。我希望始终将我的文件系统和项目同步。这个视图正好可以做到这一点。如果通过IDE创建文件,则会将其添加到适当文件夹中的文件系统中(如在IDE中选择的那样)。如果删除文件,则相应地更新文件系统。 - BluJ IT
如果您尝试在此视图中重新组织项目,则会得到一个具有损坏项目引用的解决方案。 - montonero
@montonero 我在几个复杂项目中都使用了这种方式,没有遇到任何问题。你有例子吗? - marsh-wiggle
当然,只需打开一个包含多个项目的解决方案,并尝试通过文件夹视图将这些项目移动到其他实际文件夹中即可。问题在于,VS不会更新解决方案文件中项目的路径。 - montonero
@montonero 谢谢,我以前从没这样用过,现在编辑了我的答案。 - marsh-wiggle
在VS 2022中,“解决方案资源管理器-文件夹视图”不显示文件的源代码控制状态图标。在此视图中右键单击文件时也没有源代码控制选项。 - Lee Cichanowicz

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

4
创建一个空的解决方案,然后在编辑器中打开.sln文件,在MinimumVisualStudioVersion后添加以下代码行。
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9D8C3BB1-AEDB-4757-8559-995D12A4E6D0}"

在VS中打开解决方案,然后将同一个文件夹添加到其中。 现在您可以看到该文件夹并向其中添加项目。 您在Windows中拥有一个真实的文件夹和一个虚拟的文件夹在VS中。 确保使用相同的路径创建项目。

这里关键是第一个GUID。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接