MSBuild,包含基于一组路径的文件

时间:2011-09-13 09:27:31

标签: visual-studio-2010 msbuild build msbuild-4.0

我正在尝试创建一个构建脚本,该脚本允许我指定特定网站中包含的“模块项目”的路径列表。

因此,我有这个布局:

customer folder
    |_MainProject
    |_ModuleProject1
    |_ModuleProject2

所以,基本上我希望能够指定一个包含ModuleProject1和2的ItemGroup,并将相关文件复制到MainProject中。

<ItemGroup>
  <CustomModule Include="ModuleProject1\*.csproj" />
  <CustomModule Include="ModuleProjec2\*.csproj" />
</ItemGroup>

在我的主构建脚本中,我想查找我的附属程序集的路径,以及驻留在项目的obj \ Release * .dll文件夹中的所有dll。

我已经有项目文件(.csproj)的项目组,所以基本上我只想添加一些文件引用。但我无法弄清楚我会怎么做。这就是我今天所拥有的:

<Satellites Include="$(ReferencesFolder)\??\*.dll" />
<Satellites Include="$(SiteRoot)\bin\??\*.dll" />
<Satellites Include="%(CustomModule.RelativeDir)obj\$(Configuration)\??\*.dll" />

我如何根据我所拥有的事实制作最后一行?

这样做时:

<Message Text="%(CustomModule.RelativeDir)obj\$(Configuration)\??\*.dll" />

输出:

ModuleProject1\obj\Release\??\*.dll
ModuleProject2\obj\Release\??\*.dll

如果有人通过好例子与MSBuild的基础知识有一些链接,我会非常感激。我总是最终在msdn上看到了一些非常神秘的例子,并没有真正解释过很多。

编辑:我修改了我的计划并且几乎让它工作了,但是包含并没有像我期望的那样真正起作用。没有包含任何内容,但有文件可供使用。

如果我手动添加:

<Satellites Include="ModuleProject1\obj\Release\??\*.dll" />

它实际上包含在“卫星”项目组中。

1 个答案:

答案 0 :(得分:1)

我自己找到了一个解决方案,似乎我需要一个解决方法才能明确地工作。

由于我无法根据其他项目列表添加项目,这就是我最终提出的内容:

<Target Name="BuildModules">
    <!-- We do this because we need a property with the correct wildcards, otherwise it won't work -->
    <PropertyGroup>
        <CustomModuleSatellites>@(CustomModule->'%(RelativeDir)obj\$(Configuration)\??\*.dll')</CustomModuleSatellites>
    </PropertyGroup>
    <ItemGroup>
        <Satellites Include="$(CustomModuleSatellites)" />
    </ItemGroup>
</Target>

我需要在Target中创建一个属性(在它之外它没有飞,因为它仍然包含通配符),然后使用该属性ti包含我的项目列表中使用通配符的文件,否则它将是带有通配符的路径,然后复制命令也不起作用。