问题其实很简单。我没有在Visual Studio中创建文件夹,而是在文件系统上为项目创建了一个目录结构。我如何包括所有的文件夹和文件在一个项目,保持结构?
如果我在一个名为Services的文件夹上“添加现有文件”,并导航到目录结构中的一个文件。Services > AccountManagement > CreateAccount.cs,它在Visual Studio中是这样显示的:我不想这样。
我已经制定了一个完整的目录结构,因为我正在模仿我们的客户开发人员使用相同的结构进行组织。如何在Visual Studio中将所有文件夹和文件添加到项目中?或者我必须像大多数微软用户那样“忍受”,通过Visual Studio重新创建每个文件夹?
我找不到令我满意的答案,所以我自己琢磨。
如果你想向你的项目添加外部源代码,而不想复制整个代码,这里是你的答案。我有很多依赖于其他gits,他们每小时更新,如果不是一分钟。我不能每小时拷贝一次来同步。以下是你需要做的。
假设这是结构:
/root/projA/src
/root/projA/includes
/root/projB/src
/root/projB/include
/root/yourProj/src
/root/yourProj/include
Start your VS solution.
Right-click the project name right below the Solution.
Then click the "Add", "New Filter", put the name "projA" for projA.
Right-click on the "projA", click "Add", "New Filter", enter name "src"
Right-click on the "projA", click "Add", "New Filter", enter name "includes"
Right-click "projA"/"src", click "Add", "Existing Item", then browse to the /root/projA/src to add all source codes or one by one for the ones you want.
Do same for "projA"/"includes"
Do same for projB.
Now the external/existing projects outside yours are present in your solution/project. The VS will compile them together.
Here is an trick. Since the projA and projB are virtual folders under your project, the compiler may not find the projA/includes.
If it doesn't find the projA/includes, then right click the project, select the "Properties".
Navigate to "C/C++". Edit "Additional Include Directories", add your projA/include as such "../projA/includes", relative path.
一个警告,如果有重复的包含/头文件,“头文件”上的“排除项目”实际上不起作用。这是VS中的一个bug。
您可以使用符号链接。这使得修改一个项目中的文件可以修改另一个项目中的文件(因为它实际上是同一个文件)。
这样做:
以管理员身份打开cmd提示符
Mklink /d[当前项目目录名][应该指向其他项目中的目录]
这有它的缺点和缺陷,但我偶尔会将它用于需要不同名称的重复库。
编辑Anoop:
添加到Visual Studio的步骤:
使用上述步骤在项目文件夹中创建链接。
在Visual Studio中…在解决方案资源管理器中选择项目。
在解决方案资源管理器的顶部…点击显示所有文件按钮(如果已经激活,可能需要点击两次)。
该链接现在将显示在您的项目中…右键单击并选择“包含在项目中”。
这些是我遵循的步骤,并为几个不同的项目工作。
要扩展Yuchen的回答,您可以将文件和路径作为链接。这与添加现有项不同,因为它不会在项目的文件夹结构中产生额外的副本。如果你想要一个规范的文件夹/文件等在很多不同的地方使用,但你只想维护它的一个版本/副本,它是有用的。
下面是一个可以添加到*的示例。Csproj文件创建链接
<Compile Include="$(Codez)\z.Libraries\Common\Strings\RegexExtensions.cs">
<Link>Helpers\RegexExtensions.cs</Link>
</Compile>
<Compile Include="..\..\z.Libraries\MoreLINQ\MoreLinq\ExceptBy.cs">
<Link>Helpers\ExceptBy.cs</Link>
</Compile>
<Content Include="C:\Codez\Libs\Folder\OtherFolder\**\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
$(Codez)是我定义的Windows环境变量,你可以用同样的方式使用内置的环境变量。
最后一个示例组是我在最终输出中需要的一堆内容文件。查看https://stackoverflow.com/a/11808911/492和其他答案和链接了解更多信息。
更多MSBuild信息请访问https://msdn.microsoft.com/en-us/library/bb629388.aspx