【问题标题】:msbuild include / copy from subdirectory to root directory - possible?msbuild 包含/从子目录复制到根目录 - 可能吗?
【发布时间】:2026-02-23 17:40:01
【问题描述】:

我是否可以包含子目录中的文件,但将其放在 bulid 的根目录而不是其原始子目录中?

示例:我们有多个 robots.txt 文件用于不同的发布配置。这些文件在解决方案中为 \IncludeTest\Development\robots.txt 和 \IncludeTest\Production\robots.txt

我可以使用以下方式适当地动态抓取它们:

  <ItemGroup Condition=" '$(Configuration)' == 'Development' ">
    <Content Include="IncludeTest\Development\robots.txt">
      <SubType>Designer</SubType>
    </Content>
  </ItemGroup>

但是当我这样做时,我会维护 \IncludeTest\Development\(或 \IncludeTest\Production)目录。有什么方法可以将它包含在 robots.txt 应该在的根目录中?

【问题讨论】:

  • 你试过“..\”来指定父目录吗?

标签: visual-studio-2010 msbuild csproj itemgroup


【解决方案1】:

上述方法仍然对我完全不起作用,但我能够根据您设置项目组的方式找到解决方法:

将文件包含在解决方案中作为链接将其放在根目录中。通过您的 $(Configuration) 提示,我能够做到这一点,只需将其作为链接动态包含,而不是将其复制到根目录。

<Content Include="..\Robots_Source\$(Configuration)\robots.txt">
  <Link>robots.txt</Link>
</Content>

【讨论】:

  • 那么您是否尝试过使用 任务来更新目标文件路径?我尝试了不同的情况,它对我来说非常有效,基本上将指定的文件复制到父文件夹,重要的一点是使用 $(MSBuildProjectDirectory)
【解决方案2】:

不确定我的问题是否正确,请告诉我这是否按您的预期工作:

 <ItemGroup>
    <Content Include = "IncludeTest\$(Configuration)\robots.txt">
      <SubType>Designer</SubType>
    </Content>
  </ItemGroup>

复制到根目录:

<Copy SourceFiles="@(Content)" 
   DestinationFiles="@(Content ->'..\%(RecursiveDir)%(Filename)%(Extension)')" />

编辑:文件位于嵌套目录中时可能会出现问题,因此请尝试:

 <Copy SourceFiles="@(Content)" 
   DestinationFiles="@(Content ->'$(MSBuildProjectDirectory)..\%(RecursiveDir)%(Filename)%(Extension)')" />

【讨论】:

  • 不幸的是,它的行为不像我想要的那样。它所做的是将父文件夹结构 (IncludeTest\...) 放在根目录中,而不仅仅是文件 robots.txt
  • 你做错了什么,它应该只将 @(Content) 中包含的文件移动到父目录中。在我的电脑上测试一下
  • 我在 EDIT 中又添加了一个选项,试试看
  • 我无法让它以这种方式为我工作。不知道有什么区别,但我仍然标记为答案 bc 它似乎对你有用,它最终让我找到了一些有效的东西(见下面的答案)。 - 谢谢!