【问题标题】:dynamically include files using msbuild while preserving relative path?在保留相对路径的同时使用 msbuild 动态包含文件?
【发布时间】:2013-02-13 22:28:48
【问题描述】:

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

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

但包含的文件丢失了它们的路径,例如~\Views\_Layout.cshtml 包含在 _Layout.cshtml 中(不是 Views._Layout.cshtml 所需要的)。有什么方法可以达到预期的效果吗?

【问题讨论】:

  • “CreateItem”任务已弃用,您有什么理由使用它吗?
  • ayende.com/blog/4446/…复制粘贴我想要实现的只是(1)从通配符路由中引入嵌入式资源,(2)以这种方式VS不会实现它们,(3 ) 同时保留路径结构。这管理(1)和(2)......

标签: msbuild embedded-resource csproj


【解决方案1】:

MSBuild 有New Methods for Manipulating Items and Properties。使用这些方法,您可以使用 ItemGroup(而不是 CreateItem)映射您的资源,然后创建另一个 ItemGroup 应用 MSBuild TransformsMSBuild Well-known Item Metadata。您可以使用许多项目元数据选项来实现所需的效果。 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>

【讨论】:

  • 如此简单实用。我想知道这是否适用于 OP。我刚刚将一个项目从 NAnt 切换到 MSBuild,到目前为止,我对它的深思熟虑印象深刻。
  • 您的“this answer”已被删除...您有新的链接吗?还是...?
  • @Seagal82 尽我所能找到了一个新链接,不知道为什么他们删除了答案
猜你喜欢
  • 2011-05-08
  • 2013-04-09
  • 2016-07-22
  • 2011-12-08
  • 1970-01-01
  • 2014-11-15
  • 2012-12-26
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多