在我的项目(XNA .contentproj)中,我有需要编译的文件,以及只需要复制到输出目录的文件:
<Compile Include="Foo.cs" />
<None Include="Bar.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
当我从visual studio编译时这很好用,但是当我从命令行构建项目时,这些'None'文件不会被复制到输出目录。我也尝试将副本设置为“始终”。
我怎么能告诉msbuild它应该这样做?
编辑:我发现这只适用于XNA .contenproj msbuild文件。也许我错过了一些msbuild参数。EDIT2:我现在通过手动将所有非构建内容复制到输出目录来解决这个问题。哪个工作正常,但它仍然感觉“错误”。
答案 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正在正确处理这些项目,即使项目中没有定义适当的目标。有几种方法可以解决这个问题:
<Target Name="CopyNoneItems"> <Copy SourceFiles="@(None)" DestinationFolder="$(OutputPath)" /> </Target>
hacky方式 - 包含一个正确处理项目文件中'none'项目的目标文件(例如Microsoft.CSharp.targets) - 这很麻烦,因为你导入了很多其他的东西你在此过程中不需要,这可能会引入其他问题
漫长的道路 - 解析CSharp的目标文件(或正确处理'无'项目的任何其他项目类型),以查看哪些内部导入目标文件处理'无'项目,并且可能仅导入那个文件。我遇到问题时选择了#1,所以我不确定是否有这样一个干净的.targets文件实际可行,因为所有这些目标文件之间可能存在一些依赖关系
如果您需要选择其中一种,我的建议是选择#1。它简单直接,副作用最小。