使用MSBuild动态包含文件并保留相对路径?

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

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

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

但是包含的文件失去了它们的路径,例如~\Views\_Layout.cshtml作为_Layout.cshtml被包含(而不是所需的Views._Layout.cshtml)。是否有一种方法可以实现所需的效果?

“CreateItem”任务已过时,您是否有使用它的原因? - Marcos Brigante
我想要实现的是:(1)从通配符路径中引入嵌入资源,(2)以这种方式,VS不会将它们实体化,(3)同时保留路径结构。这可以管理(1)和(2)... - mcintyre321
1个回答

2

MSBuild拥有操作项和属性的新方法。使用这些方法,您可以使用ItemGroup(而不是CreateItem)映射资源,然后创建另一个应用MSBuild转换的ItemGroup,使用MSBuild知名项元数据。 有许多项元数据选项可用于实现所需效果。在此答案中有语法的清晰示例。

我编写了一个小脚本作为示例。它创建了一个包含*.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>

1
如此简单而又实用。我想知道这是否对原帖作者起作用。我刚刚将一个项目从NAnt转换到MSBuild,迄今为止,我对它的设计思路印象非常深刻。 - harpo
你的“this answer”已被删除... 你有新的链接吗?或者...? - Seagal82
@Seagal82,我尽力找到了一个新链接,不知道为什么他们删除了答案。 - Marcos Brigante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接