在Visual Studio中,我如何为整个文件夹设置构建操作?

79
我在Visual Studio中有一个项目。我需要将一些第三方文件与我的代码一起部署。通常情况下,我会将这些文件放在“资源”目录中,并将每个文件的构建操作设置为“内容”,并将“复制到输出目录”设置为“仅在更改时复制”。
是否有办法在文件夹级别上设置这些指令?我正在处理的当前项目有几十个这样的文件和几个子文件夹。我希望能够将整个目录设置为“内容”和“仅在更改时复制”。
7个回答

93

创建项目。添加一个文件作为内容。卸载项目并手动编辑*.proj文件。

 <ItemGroup>
    <Content Include="myfolder**\*.dll**">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

然后在content-ItemGroup中,我将用一些MsBuild通配符表达式,比如*.dll,来替换那个单独的文件。


1
我尝试过这个方法。它确实有效,但是当我使用Visual Studio添加一个项目时,它会移除通配符并将所有单独的项目更改回<Content None ...>。我还尝试了https://dev59.com/YE_Sa4cB1Zd3GeqP_EmR上的建议,但那根本不起作用。 - Colin
19
这个通配符语句可以帮助我复制所有文件和子目录:<Content Include="MyFolder\\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> - Minh Nguyen
1
@Arve 这个真是宝石啊,我一直在苦苦挣扎,但是在24小时后找到了你的答案。 - WitVault
这个完美地运作。有没有办法也排除父文件夹?如果我有一个文件在MyFolder\file.txt里面,如何只复制文件而不是它的父文件夹呢? - AzeExMachina

11

我使用的是Visual Studio 2012,您可以在“解决方案资源管理器”中按Shift键并单击以选择多个项目,然后在“属性”窗口中一次性编辑每个项目的“复制到输出目录”属性。

尽管这在功能上不等同于您正在寻找的解决方案,但从语义上来说是相似的。希望下一个遇到需要处理大量文件夹(就像我一样)的人不必深入了解.csproj文件。

希望这能帮助到您!


谢谢!肯定比一个一个地做快,也比手动编辑项目文件快。 - nightcoder

8

如果您需要设置整个文件夹的“生成操作(Build Action)”,最好的方法是打开.csproj文件,使用正则表达式替换所有出现的内容。

<Content ....

为了

<None ...

对于我来说,这个方法在IT技术方面非常完美地起到了作用。具体内容可以参考这里


这确实是一种更好的解决方案。 - Radu Simionescu
嗯,但是如果您可以在“工具”>“选项”中设置此选项,那不是更合理吗?每次添加新资产到项目中时默认排除它非常令人恼火。(如果我不想将其包含在最终构建中,我为什么要添加一个资产呢?) - Kokodoko
我的使用情况是,我必须从发布中排除位于项目根目录下的一个巨大(100MB)/public/目录(因为我曾经复制过它,而且不会再改变)。但是,我确实想将其包含在我的项目中,因此也要包含在源代码控制中。这个解决方案非常适用于这种情况。我没有使用正则表达式,而是使用了替换所有的方法。 - Gerben Rampaart

5
我刚刚将以下代码添加到我的*.csproj文件中(右键编辑项目文件)。
<ItemGroup>
    <Content Include="MYCUSTOMFOLDER\**">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>

我知道这个答案与@Arve相似,但我不知道为什么要使用.dll通配符过滤器增加额外的复杂性。


0

如果您想保留递归文件夹结构,可以添加以下 XML 代码:

  <ItemGroup Label="bg_screens">
      <_CustomResource Include="..\..\resourcedir\**\*">
          <Link>resourcedir\%(RecursiveDir)%(FileName)%(Extension)</Link>
          <DeploymentContent>true</DeploymentContent>
      </_CustomResource>
  </ItemGroup>

资源将保持树形结构,而不是以平面方式添加。


0

编辑您的 *.csproj 或 .vbproj 文件

添加此标签

  <ItemGroup>
    <Folder Include="YOUR_FOLDER_NAME_HERE/">
  </ItemGroup

最终文件必须长成这个样子:

<Project>
<---some more tags--->
      <ItemGroup>
        <Folder Include="YOUR_FOLDER_NAME_HERE\" />
      </ItemGroup
<---some more tags--->
</Project>

尝试过这个但不行。我想在项目部署时添加一个空文件夹。但这样做并没有成功。 - sr28

0
你可以使用这个:
<ItemGroup>
   <Content Include="yourfolderpath/*.*">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
   </Content>
</ItemGroup>

'*.*' 这意味着将 'yourfolderpath' 路径中的所有文件复制到构建文件夹中。
'yourfolderpath' 这个文件夹必须在项目文件夹中。

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