MSBuild文档提示了几个地方,项目不一定与文件相同。如何在不表示文件的项目上使用执行MSBuild批处理?
"MSBuild items are inputs into the build system, and they typically represent files."
不过,我似乎无法找到任何例子,其中的项目并不代表文件。特别是,我想对一组非文件项目执行批处理。但是,我创建的每个项目(即使是自定义构建任务)都会以某种方式获取类似文件的元数据(FullPath,RootDir,文件名,扩展名等)。此外,我对将目标的输入设置为一组不是文件的项目以及将该目标的输出用作什么的后果感到困惑。
有没有人有一个使用非文件项目在MSBuild中执行批处理的例子?
编辑
对不起了那么久才拿出一个例子。我对事情有了更多的了解,但我仍然不确定(而且似乎完全没有关于此的文档)。这里的一切都是关于我的记忆。我现在不在我的工作计算机上,所以我无法验证它。
以我的经验,MSBuild不喜欢一次构建多个.sln文件的配置。所以,这样的:
msbuild.exe SampleMSBuild.sln /p:Configuration=Debug%3BRelease
(编码后的分号是必要的,这样就不会尝试定义多个属性)
产生以下:
"D:\src\SampleMSBuild\SampleMSBuild.sln" (default target) (1) ->
(ValidateSolutionConfiguration target) ->
D:\src\SampleMSBuild\SampleMSBuild.sln.metaproj : error MSB4126: The
specified solution configuration "Debug;Release|Any CPU" is invalid.
Please specify a valid solution configuration using the Configuration
and Platform properties (e.g. MSBuild.exe Solution.sln
/p:Configuration=Debug /p:Platform="Any CPU") or leave those properties
blank to use the default solution configuration.
[D:\src\SampleMSBuild\SampleMSBuild.sln]
所以,现在看来似乎应该可以使用配料和物品来处理这个问题。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTarget="Rebuild"
ToolsVersion="4.0">
<ItemGroup>
<Configurations Include="Debug" />-->
<Configurations Include="Release" />-->
</ItemGroup>
<UsingTask TaskName="LogMetadata"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<Items ParameterType="Microsoft.Build.Framework.ITaskItem[]"
Required="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs">
<![CDATA[
foreach (var item in Items) {
Console.Write(item.ItemSpec);
Console.Write(" {");
foreach (string metadataKey in item.MetadataNames) {
Console.Write(metadataKey);
Console.Write("=\"");
Console.Write(item.GetMetadata(metadataKey).
ToString().Replace("\"", "\\\""));
Console.Write("\" ");
}
Console.WriteLine("}");
}]]>
</Code>
</Task>
</UsingTask>
<Target Name="Rebuild">
<LogMetadata Items="%(Configurations.Identity)" />
</Target>
</Project>
将会产生这样的:
Debug {
FullPath="D:\src\SampleMSBuild\Debug"
RootDir="D:\"
Filename="Debug"
Extension=""
RelativeDir=""
Directory="src\SampleMSBuild\"
RecursiveDir=""
Identity="Debug"
ModifiedTime=""
CreatedTime=""
AccessedTime=""
}
Release {
FullPath="D:\src\SampleMSBuild\Release"
RootDir="D:\"
Filename="Release"
Extension=""
RelativeDir=""
Directory="src\SampleMSBuild\"
RecursiveDir=""
Identity="Release"
ModifiedTime=""
CreatedTime=""
AccessedTime=""
}
正如你可以看到,该项目具有各种附加到他们的文件的元数据。我不能删除包含属性,因为它是必需的,但我可以在自定义任务中合成这些项目。但是,当我这样做时,他们仍然以某种方式神奇地获得所有相同的文件元数据。
这是什么影响?由于我没有将这些作为输入或输出指定给目标,文件元数据是否会导致任何问题?由于项目的FullPath元数据中指定的文件不存在,生成系统是否会跳过目标或构建超出需要的目标?如果这些文件确实存在?会导致任何问题吗?
一些片段或伪代码可能有助于理解你想要完成什么。 – KMoraz