命令行中的Msbuild不会将不需要编译的文件复制到输出目录

时间:2010-10-17 17:47:17

标签: msbuild

在我的项目(XNA .contentproj)中,我有需要编译的文件,以及只需要复制到输出目录的文件:

    <Compile Include="Foo.cs" />
    <None Include="Bar.xml">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>

当我从visual studio编译时这很好用,但是当我从命令行构建项目时,这些'None'文件不会被复制到输出目录。我也尝试将副本设置为“始终”。

我怎么能告诉msbuild它应该这样做?

编辑:我发现这只适用于XNA .contenproj msbuild文件。也许我错过了一些msbuild参数。

EDIT2:我现在通过手动将所有非构建内容复制到输出目录来解决这个问题。哪个工作正常,但它仍然感觉“错误”。

2 个答案:

答案 0 :(得分:1)

就这样做吧。

<None Include="Bar.xml">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>

(如果您更改VS内的属性,它应该这样做。)

答案 1 :(得分:1)

这很可能是因为XNA项目的特定目标定义(一般情况下,或您的特定目标)。 “无”项目在任何方面都不是特殊的,它们被视为与任何其他项目一样,在某种意义上,除非有特定的任务实际处理它们,否则它们将没有任何效果。共同目标文件 - 例如Microsoft.CSharp.targets; Microsoft.Cpp.targets - 按照文档here的正确方式处理“无”项目。

一种可能性是,已经定义了一个目标,用于复制项目文件中的None项,但该目标不包含在项目文件的“Project”节点的DefaultTargets属性中。如果是这种情况,您仍然可以通过在/target命令行参数中传递来调用该目标。

另一个(也不太可能)选项是VS正在正确处理这些项目,即使项目中没有定义适当的目标。有几种方法可以解决这个问题:

  1. 直接的方式 - 定义复制文件并将其添加到默认目标的目标,或者使用BeforeTargets / AfterTargets将其放入目标链中。例如(请参阅“复制”任务here的文档):
  2.   <Target Name="CopyNoneItems">
        <Copy SourceFiles="@(None)"
        DestinationFolder="$(OutputPath)" />
      </Target>
    
    1. hacky方式 - 包含一个正确处理项目文件中'none'项目的目标文件(例如Microsoft.CSharp.targets) - 这很麻烦,因为你导入了很多其他的东西你在此过程中不需要,这可能会引入其他问题

    2. 漫长的道路 - 解析CSharp的目标文件(或正确处理'无'项目的任何其他项目类型),以查看哪些内部导入目标文件处理'无'项目,并且可能仅导入那个文件。我遇到问题时选择了#1,所以我不确定是否有这样一个干净的.targets文件实际可行,因为所有这些目标文件之间可能存在一些依赖关系

    3. 如果您需要选择其中一种,我的建议是选择#1。它简单直接,副作用最小。