首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清理后MSBuild ItemGroup为空

清理后MSBuild ItemGroup为空
EN

Stack Overflow用户
提问于 2011-10-28 03:33:21
回答 1查看 884关注 0票数 1

我发现ItemGroup标签有一些奇怪的行为。

我的应用程序依赖于几个DLL,我将这些DLL以及可执行文件复制到部署目录,NSIS使用该目录从全新构建创建安装包。然而,我在这方面遇到了一个奇怪的问题。

我定义我的ItemGroup如下(在定义我的构建目标之前,在文件的顶部:

代码语言:javascript
复制
<MyAppFiles Include="$(ProjectRoot)\$(OutputPath)\*.dll;$(ProjectRoot)\$(OutputPath)\MyApp.exe" />

因此,这将获取目录中的所有MyApp.exe以及二进制all。但是,如果项目已被清理(即,$(OutputPath)中没有文件)。ItemGroup文件列表中不包括DLL。现在,如果我接着进行另一个构建(即,在$(OutputPath)中有来自上一个构建的文件),ItemGroup包含了我想要的所有文件。

此外,我还检查了构建脚本的输出,并将DLL复制到$(OutputPath),以确定是否发生了清理。

因此,我的问题是,如何更正我的构建脚本,使ItemGroup始终包含DLL?似乎在构建发生之前,ItemGroup会填充文件,所以如果文件在构建之前不在那里,它们就不会包括在列表中,但如果它们在构建之前就存在,那么它们就会存在。

作为参考,下面是我使用的build目标:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-28 03:42:14

假设项目数组是在项目的根级别声明的,在XML中声明为元素的子元素。这意味着当第一次加载项目文件时,MSBuild将计算项数组中的成员身份。这些文件在执行期间是否存在更改是无关紧要的。如果要在构建中的特定点填充项数组,则需要将声明从静态项数组更改为动态项数组,这意味着将其移动到目标内部,以精确到要收集文件的位置,如下所示:

代码语言:javascript
复制
<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 )

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7921313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档