ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

编辑:谢谢。那就给VS2010提个建议吧:)

这是最烦人的 Visual Studio 怪癖之一
我该如何正确处理这个怪癖?
有趣的是,Rider 有点具有此功能(但文件夹必须与 .sln 文件位于同一路径,并且实际文件夹引用不存储在 .sln 文件本身中):jetbrains.com/help/rider/Extending_Your_Solution.html
我正在使用 VS 2017,据我所知,MS 尚未添加允许将整个文件夹添加到解决方案文件夹的功能 - 必须添加单个文件。

R
Ray

有一种解决方法,它实际上按预期运行。

将新网站或现有网站添加到解决方案。 (我通常创建一个新的。)只需确保它是在您的解决方案文件夹中创建的。 (有时我什至会创建一个指向外部文件夹的“链接”,例如网络共享上的“Docs”或“Marketing”。在这种情况下,Git 当然会忽略它。)确保转到“项目”设置或配置经理从构建和部署中排除这个“网站”!

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

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

我知道该功能不适用于该用例,但除了可能具有误导性的“项目”图标之外,我还没有发现该 hack 的任何不足之处。还有一些用例,其中 VS 提供的经典(虚拟)解决方案文件夹适合图片。你怎么看?


以下是完整的说明:右键单击解决方案->“添加”->“新建网站...”->(我选择了“ASP.NET 空网站”)。更改位置后不要忘记将“\MyName”附加到路径,否则单击“确定”将简单地重新打开对话框。之后,右键单击您的解决方案->“属性”->“配置属性”->取消选中 Web 项目的“构建”。
这仍然有效吗?使用VS2015,但它不起作用。
在 VS2017 中完美创建了一个真实的文件夹,但在解决方案资源管理器中显示了网站图标(黑圈)。有人知道如何解决吗?
是的,它在 VS2019 中工作,但仍然不监视文件系统更改。您必须偶尔“刷新”才能查看当前文件。如果只有 C# 项目不是唯一支持新的、更干净和更清晰的基于文件系统 glob 的 .*proj 格式的解决方案类型。
s
svlists

无特殊设置。我不认为它被支持。

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


截至 VS 2017,这似乎仍然是准确的。
...和VS 2019
关于VS的最糟糕的事情之一。为什么 MS 不保留 Sln 文件夹作为选项,但也允许将 REAL 文件夹添加到解决方案中。很烦人。文件系统有效,为什么要重新发明轮子(作为正方形)。
您可以更改项目的行为:stackoverflow.com/a/66004927/9050921
O
OdeToCode

https://i.stack.imgur.com/k71Ve.png


这很有用,但是在“源视图”中,您丢失了项目上的所有右键单击快捷方式,即“管理 NuGet 包”。
为什么只有 C++ 解决方案或项目的行为与其他语言不同?
这对我有帮助,所以我在我想要的文件夹视图中创建了一个文件夹,然后我添加了一个解决方案文件夹并将项目添加为文件夹的子项。对我来说真的没有意义,但这个答案帮助了我
这正是我想要的。谢谢!
r
rsenna

选择的答案表明可以使用实际项目而不是解决方案文件夹,但并没有真正解释如何。我想我在这里描述的可能是实现这一目标的最不尴尬的方式...... :-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 文件夹的 any 子文件夹中的 any 文件。

据我所知,这个解决方案的工作原理与 OP 所要求的非常相似:它将作为对文件夹的不可编译引用,并且会自动反映对其所做的任何更改。


以我的经验,一旦一个毫无戒心的团队成员触及任何文件属性,这就会累积起来。之后,导航窗格中会出现重复的文件。在某些情况下,每个文件最终都会在 .proj 文件中枚举,然后就会出现丑陋。尽管我不喜欢放弃,但我仍然更喜欢“添加现有网站”的方法。
@shannon我从来没有经历过你提到的行为,但是“没有证据不是没有证据”,所以就是这样。但我每天都使用共享项目,所以我认为这也很重要。关于网站项目(WSP),我想它们也可以工作,我已经很长时间没有使用它了。
u
user247702

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


r
ryan

Folder To Solution Folder By Cecilia Wirén - CeciliaSHARP

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


A
Armin Torkashvand

您可以同步新的解决方案文件夹嵌套级别,也可以使用实际的文件系统文件夹命名,它就像一个魅力!

现有项目:

创建实际文件夹

使用完全相同的名称创建解决方案文件夹

将您的项目文件夹复制到新文件夹中(实际文件系统)

(在解决方案资源管理器中) - 右键单击同一文件夹

添加 => 现有项目

添加新项目:

创建您的解决方案文件夹

(右键单击解决方案)=> 添加新项目

将要添加的项目名称下的位置地址更改为解决方案文件夹中完全相同的地址


“将您的项目放入其中”是指“将您的项目文件夹(上面有文件)放入您刚刚在文件系统中创建的“实际文件夹”中”吗?
@GrantRobertson 我做了一些编辑。希望能帮助到你。
我可以确认这在 VS2019 中有效!我们这些不断改变对文件夹结构的看法的人最终会遇到这个问题。我希望它更容易。请注意,如果您已经在源代码管理中拥有项目,则在此之后签入时您将有更多工作要做。
@Angelo 没错,所有文件都成为他们的第一个源代码控制版本。
A
Alan

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


n
northWind

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

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

托管在视觉工作室画廊:https://visualstudiogallery.msdn.microsoft.com/69e19ea6-4442-4cb6-b300-044dd21f02bd

编辑:上传到 bitbucket。现在开源。麻省理工学院许可证。 https://bitbucket.org/LSS_NorthWind/physical-solution-folders


r
rc21

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


m
marsh-wiggle

对于 Visual Studio 2019 中的 C#,我使用了这种方式 (Seems to be similar to this answer, but that didn't work at least in C# solutions)

在解决方案资源管理器中单击切换视图

https://i.stack.imgur.com/H9D1W.png

选择文件夹视图

https://i.stack.imgur.com/mOhT3.png

您可以将单个文件夹添加到解决方案

https://i.stack.imgur.com/VPCKE.png

要返回解决方案资源管理器的常规视图,只需再次单击切换视图并选择解决方案。

使用这种方式似乎有一个限制(来自@montonero 的评论):

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


我不确定这是否是 VS 2019 的新功能,但这确实提供了我需要的功能。我想让我的文件系统和项目始终保持同步。这种观点正是如此。如果文件是通过 IDE 创建的,则会将其添加到文件系统中的相应文件夹中(如在 IDE 中选择的那样)。如果文件被删除,文件系统会相应地更新。
如果您尝试在此视图中重新组织项目,您将获得一个包含损坏项目引用的解决方案。
@montonero 我在几个复杂的项目中使用了这种方式,没有任何问题。你有一个例子吗?
当然,只需打开一个包含多个项目的解决方案,然后尝试通过文件夹视图将项目移动到其他一些真实文件夹。问题是 VS 不会更新解决方案文件中项目的路径。
@montonero 谢谢,我从来没有这样用过,现在编辑了我的答案
P
Paul Easter

我自己也想要这个功能几次,但归根结底,你真的不希望有能力做到这一点。将您的解决方案(文件)视为 Web 应用程序的根,并将解决方案文件夹视为虚拟目录(从字面上和功能上)。 Web 虚拟目录的内容可能在物理上完全位于不同的服务器上。 Visual Studio 混淆解决方案文件夹概念的地方是允许您在文件夹中创建新文件。添加内容时,您应该始终“添加现有”。添加现有文件时,它会创建指向文件源位置的链接。

但是,您不希望解决方案文件夹表现得像“物理”文件夹的原因是因为您的解决方案布局可能不一定使用与源代码管理布局相同的约定。解决方案文件夹允许您自定义项目的层次结构,以便您可以以任何您喜欢的方式将项目和项目组合在一起,然后决定您不喜欢它并再次更改它,而不必经历移动源代码管理项目的噩梦周围并激怒团队的其他成员。


这是正确的答案 - 在磁盘上与虚拟文件夹同名的文件夹中创建文件,然后使用“添加现有”在 VS 中添加文件。
他们本可以轻松实现虚拟文件夹和物理文件夹。这显然是一个俯瞰。请参阅参考资料:其他所有 IDE。
我完全不明白为什么(IIS)虚拟目录的概念与解决方案文件夹有任何关系。至于源代码控制论点,我看不出有什么问题。为什么文件移动会激怒团队的其他成员?这是一种常见的操作。为什么您希望源代码管理中的文件布局与物理布局不同?
物理解决方案文件夹将使创建现代文件夹结构(如 NancyFx's)更容易(尽管只是一点点),其中多个项目属于 srctesttools 等类别。您肯定想要在项目一开始就做出这个决定来激怒团队,但大多数架构决策都是如此。
-1 我的用例是这样的:有时我们只想将某些文档添加到解决方案中。它们不会被构建,但它们会保留在源代码管理中。我们通常为他们准备一个特殊的文件夹。我想在我的解决方案中包含该文件夹 - 不是它包含的文件,而是文件夹本身。是的,有一些方法可以绕过这个限制,但它们并不是最优的。对解决方案中的文件夹有一个实际的引用就可以了。
A
Ankit

注意:是的,您可以在根目录上创建一个文件夹,但它有点棘手......

通过付出一些额外的努力,你可以做到如何?让我们按照步骤——

1-创建文件夹,例如:根目录上的“newfolder”(您的 .sln 文件所在的位置)。

2.将您的项目复制并粘贴到文件夹中。

3.转到您的 sln 文件并找到已移动的项目并将 newfolder\ 添加到已移动项目的地址中。

4.保存sln文件。

5.打开您的项目并在git中提交存储库...

6.将存储库放在新位置。你完成了...

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

1.添加解决方案文件夹xyz。

2.打开 sln 文件并用您的文件夹名称更改该文件夹名称。

恭喜你完成了。。

如果您遇到任何问题,请写信给我寻求帮助..


这是关于如何移动项目文件夹的说明,而 OP 询问如何在解决方案下显示附加目录而不静态列出所有文件。
k
keyone2693

创建一个空解决方案,然后在编辑器中打开 .sln 文件并将这些代码行放在 MinimumVisualStudioVersion 之后

Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9D8C3BB1-AEDB-4757-8559-995D12A4E6D0}"

在 vs 中打开解决方案,您应该向其中添加相同的文件夹,现在您可以看到该文件夹并向其中添加一个项目,您在 windows 中有一个真实文件夹,在 vs 中有一个虚拟文件夹

确保您使用该路径创建了项目


A
Abhijit K Rao

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


此功能特定于 C++ 项目。
该解决方案也适用于 VS 项目 - 问题是关于解决方案级别的文件夹。
d
dove

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

ps-仔细看看也许我应该解释一下“鲍勃是你的叔叔”的意思是你的罚款/分类。


罗伯特是你母亲的兄弟有关系吗?
M
Matthew Layton

我对此有一些解决方法(它不是很好,但它有效)。

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

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


R
Rub

是的,该项目可以在 Visual Studio 2019 中使用

虽然这是一个老话题,但我会添加我的答案,因为我遇到了同样的问题并搜索了解决方案,但似乎每个人都 100% 确定没有办法做到这一点。于是我开始尝试VS 2019,尝试了很多设置,最终找到了出路。

1 个按钮:D

https://i.stack.imgur.com/6ExuW.png

现在您可以将文件和文件夹添加到项目中,它们将被添加到文件系统(物理上)

https://i.stack.imgur.com/yhJG4.png

我对 C++ 的推荐

在项目目录中创建一个根文件夹,其中将包含所有与应用程序相关的内容(代码、标题、数据、库...)。我将它命名为 Project Add subfolders,因为您想构建代码。我更喜欢以下布局:include、src、data、libs 等

https://i.stack.imgur.com/jlbJZ.png

现在设置 Visual Studio 以将这些文件夹识别为标头和源目录。在解决方案资源管理器中单击您的项目。请注意,在我的情况下,它是 CrazyDemo,而不是解决方案“CreazyDemo”(1 个项目中的 1 个) 转到项目属性菜单:项目→属性打开配置属性→VC++ 目录选项卡编辑包含目录并设置为 $(ProjectDir)/ Project/include;$(IncludePath) 编辑库目录并设置为 $(ProjectDir)/Project/libs;$(LibraryPath) 编辑源目录并设置为 $(ProjectDir)/Project/src;$(SourcePath)

https://i.stack.imgur.com/lNXNQ.png

如果您想专注于 1 个项目,您可以使用 Scope to This 选项。只需右键单击项目文件夹并按 Scope to This 注意,在此操作之后,为了打开项目属性,您需要单击任何项目文件(如示例中的 main.cpp),然后单击可编辑的客户区(比如当你想改变代码时),只有在那之后你才能看到 Project→CrazyDemo Properties 选项。 [Visual Studio 疯了🤦‍♂️]

最后,你可能有这样的项目

https://i.stack.imgur.com/B7NGL.png


可以保存这是一个模板吗?或者,每次在解决方案中创建新项目时,我是否必须完成所有这些步骤?
不知道,没试过用模板
这仅适用于项目内的文件夹。您不能以这种方式将多个项目组合成一个文件夹。
@montonero 是的,正如我在回答的第一句话中所说:)
好吧,我看到了“项目”这个词,但我没有看到您以任何方式强调这仅适用于项目,所以我已经说清楚了。