gpt4 book ai didi

msbuild - 如何对不代表文件的项目执行 MSBuild 批处理?

转载 作者:行者123 更新时间:2023-12-02 00:14:39 27 4
gpt4 key购买 nike

MSBuild 文档在多个地方暗示项目不一定与文件相同。

"MSBuild items are inputs into the build system, and they typically represent files."

"Items are objects that typically represent files."

但是,我似乎找不到任何 Items 不代表文件的示例。特别是,我想对一组非文件项执行批处理。但是我创建的每个项目,即使是来自自定义构建任务,都会以某种方式获取类似文件的元数据(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=""
}

如您所见,这些项目附加了各种文件元数据。我不能删除 Include 属性,因为它是必需的,但我可以在自定义任务中合成项目。然而,当我这样做时,他们仍然以某种方式神奇地获得了所有相同的文件元数据。

这有什么后果?由于我没有将这些指定为目标的输入或输出,文件元数据会导致任何问题吗?构建系统是否会跳过目标,或者构建超出其需要的目标,因为 Items 的 FullPath 元数据中指定的文件不存在?如果这些文件确实存在怎么办?会不会有什么问题?

最佳答案

我使用项目依次构建多个解决方案并使用它们执行一些“手动”任务,因此我定义了自己的项目:

<ItemGroup>
<MergeConfigurations Include="project1\project1.SDK.sln">
<MergeOutAssemblyName>product1.dll</MergeOutAssemblyName>
<MergePrimaryAssemblyName>project1.Interfaces.dll</MergePrimaryAssemblyName>
<SolutionBinaries>project1\bin\$(FlavorToBuild)</SolutionBinaries>
</MergeConfigurations>

<MergeConfigurations Include="project1\project1.Plugin.sln">
<MergeOutAssemblyName>product1.dll</MergeOutAssemblyName>
<MergePrimaryAssemblyName>project1.Interfaces.dll</MergePrimaryAssemblyName>
<SolutionBinaries>project1\bin\plugin\$(FlavorToBuild)</SolutionBinaries>
</MergeConfigurations>
<ItemGroup>

然后我使用目标获取信息并执行必要的操作:

<Target Name="MergeSolution"
Inputs="%(MergeConfigurations.Identity)"
Outputs="%(MergeConfigurations.Identity)\Ignore_this">

<PropertyGroup>
<MergeSolution>%(MergeConfigurations.Identity)</MergeSolution>
<MergeOutAssemblyName>%(MergeConfigurations.MergeOutAssemblyName)</MergeOutAssemblyName>
<MergePrimaryAssemblyName>%(MergeConfigurations.MergePrimaryAssemblyName)</MergePrimaryAssemblyName>
<SolutionBinaries>%(MergeConfigurations.SolutionBinaries)</SolutionBinaries>
</PropertyGroup>

[....]
</Target>

希望这有助于为您指明所需的方向。

关于msbuild - 如何对不代表文件的项目执行 MSBuild 批处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com