我发现ItemGroup标签有一些奇怪的行为。
我的应用程序依赖于几个DLL,我将这些DLL以及可执行文件复制到部署目录,NSIS使用该目录从全新构建创建安装包。然而,我在这方面遇到了一个奇怪的问题。
我定义我的ItemGroup如下(在定义我的构建目标之前,在文件的顶部:
<MyAppFiles Include="$(ProjectRoot)\$(OutputPath)\*.dll;$(ProjectRoot)\$(OutputPath)\MyApp.exe" />因此,这将获取目录中的所有MyApp.exe以及二进制all。但是,如果项目已被清理(即,$(OutputPath)中没有文件)。ItemGroup文件列表中不包括DLL。现在,如果我接着进行另一个构建(即,在$(OutputPath)中有来自上一个构建的文件),ItemGroup包含了我想要的所有文件。
此外,我还检查了构建脚本的输出,并将DLL复制到$(OutputPath),以确定是否发生了清理。
因此,我的问题是,如何更正我的构建脚本,使ItemGroup始终包含DLL?似乎在构建发生之前,ItemGroup会填充文件,所以如果文件在构建之前不在那里,它们就不会包括在列表中,但如果它们在构建之前就存在,那么它们就会存在。
作为参考,下面是我使用的build目标:
<PropertyGroup>
<MyAppRoot>..\MyApp</MyAppRoot>
<MyAppProject>$(MyAppRoot)\MyApp.csproj</MyAppProject>
<PropertyGroup>
<Target Name="BuildProject">
<Message Text="BEFORE: @(ProjectFiles)" />
<MSBuild Projects="$(MyAppProject)" Targets="Build" Properties="Configuration=$(Configuration)">
<Output TaskParameter="TargetOutputs" ItemName="MyAppAssembly"/>
</MSBuild>
<Message Text="AFTER: @(ProjectFiles)" />
</Target>发布于 2011-10-28 03:42:14
假设项目数组是在项目的根级别声明的,在XML中声明为元素的子元素。这意味着当第一次加载项目文件时,MSBuild将计算项数组中的成员身份。这些文件在执行期间是否存在更改是无关紧要的。如果要在构建中的特定点填充项数组,则需要将声明从静态项数组更改为动态项数组,这意味着将其移动到目标内部,以精确到要收集文件的位置,如下所示:
<Target Name="BuildProject">
...before message
...msbuild task
<ItemGroup>
<ProjectFiles Include="$(ProjectRoot)\$(OutputPath)\*.dll" />
<ProjectFiles Include="$(ProjectRoot)\$(OutputPath)\MyApp.exe" />
</ItemGroup>
...after message
</Target>(摘自“MSBuild Trickery”一书中的技巧#62 )
https://stackoverflow.com/questions/7921313
复制相似问题