Msbuild from命令行不复制不在';不需要编译到输出目录

Msbuild from命令行不复制不在';不需要编译到输出目录,msbuild,Msbuild,在我的项目(一个XNA.contentproj)中,我有需要编译的文件,以及只需要复制到输出目录的文件: <Compile Include="Foo.cs" /> <None Include="Bar.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> 保存最新 当我从VisualStudio

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

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

保存最新
当我从VisualStudio编译时,这很好,但是当我从命令行构建项目时,这些“无”文件不会复制到输出目录。我也试着将副本设置为“始终”

我如何告诉msbuild它应该这样做

编辑:我发现这只适用于XNA.contenproj msbuild文件。可能我缺少一些msbuild参数

EDIT2:我现在已经解决了这个问题,只需手动将所有非构建内容复制到输出目录。这样做很好,但仍然感觉“不对”

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

总是

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

这很可能是因为XNA项目的特定目标定义(一般或您的特定目标定义)。 “无”项在任何方面都不是特别的,它们被视为与任何其他项一样,从某种意义上说,除非有一个特定的任务实际处理它们,否则它们不会产生任何效果。通用目标文件-例如Microsoft.CSharp.targets;Microsoft.Cpp.targets-请按照文档记录的正确方式处理“无”项

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

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

  • 直截了当的方法-定义一个复制文件并将其添加到默认目标的目标,或者使用BeforeTargets/AfterTargets将其放入目标链中。例如(参见“复制”任务的文档):
  • 
    
  • 黑客方式-包括一个目标文件,该文件可以正确处理项目文件中的“无”项(例如,Microsoft.CSharp.targets)-这是一种黑客方式,因为您正在导入过程中不需要的大量其他内容,这可能会引入其他问题

  • 长途跋涉-解析CSharp的目标文件(或正确处理“无”项的任何其他项目类型),以查看哪个内部导入的目标文件处理“无”项,并可能仅导入该文件。当我遇到这个问题时,我选择了#1,所以我不确定是否有这样一个干净的.targets文件能够真正工作,因为所有这些目标文件之间可能存在一些依赖关系


  • 如果您需要选择其中一个,我的建议是使用#1。它简单明了,副作用最小。

    Hmm好的,我把copytooutputdirectory设置为preservenest,这不起作用。我将尝试设置为“始终”。不幸的是,这也不起作用。对不起,我应该在我的问题中指定这一点。要调试VS和命令行之间的差异,您可以执行“tools\option\projects&solutions\build&run”并将详细程度设置为diagnostic,然后与命令行上的
    /v:diag
    进行比较(两者不同),假设VS正在设置一些属性,您也可以使用
    /p:name=val
    在命令行上设置这些属性。
      <Target Name="CopyNoneItems">
        <Copy SourceFiles="@(None)"
        DestinationFolder="$(OutputPath)" />
      </Target>