使用msbuild动态包含文件,同时保留相对路径?

时间:2013-02-13 22:28:48

标签: msbuild embedded-resource csproj

我正在尝试使用以下msbuild目标将第二个项目中的文件包含为EmbeddedResources:

    <CreateItem Include="..\MyProject.Templates\**\*.css">
      <Output ItemName="EmbeddedResource" TaskParameter="Include" />
    </CreateItem>

但是包含的文件会丢失它们的路径,例如~\Views\_Layout.cshtml包含_Layout.cshtml(根据需要不是Views._Layout.cshtml)。有没有办法达到预期的效果?

1 个答案:

答案 0 :(得分:2)

MSBuild有New Methods for Manipulating Items and Properties。使用这些方法,您可以使用ItemGroup(而不是CreateItem)映射资源,然后使用MSBuild Transforms创建另一个应用MSBuild Well-known Item Metadata的ItemGroup。您可以使用许多项目元数据选项来实现所需的效果。 this answer上有一个明确的语法示例。

我写了一个小脚本作为例子。它创建一个带有* .exe文件的ItemGroup并对其进行转换。使用MSBuild 3.5进行测试。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project DefaultTargets="CreateItems" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="CreateItems">
    <ItemGroup>
      <Exe Include="..\**\*.exe" />
    </ItemGroup>
    <ItemGroup>
      <TransformedExe Include="@(Exe->'%(Relativedir)')"/>
    </ItemGroup>
    <Message Text="1 - @(Exe)" />
    <Message Text="2 - @(TransformedExe)" />
  </Target>
</Project>