2013-02-13 48 views
3

我想包括从第二个项目文件,使用下面的MSBuild目标EmbeddedResources:动态包含使用msbuild的文件,同时保留相对路径?

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

但包含的文件失去其路径例如~\Views\_Layout.cshtml包含在_Layout.cshtml(不是Views._Layout.cshtml,如所期望的那样)。有什么方法可以达到预期的效果吗?

+0

的“CreateItem”任务已过时,在那里为你使用它的任何理由? – 2013-02-14 00:39:19

+0

复制n贴从http://ayende.com/blog/4446/how-to-setup-dynamic-groups-in-msbuild-without-visual-studio-ruining-them我想要实现的是(1)自动在通配符路由的嵌入式资源中,(2)以这种方式VS不实现它们,(3)在保留路径结构的同时。这管理(1)和(2)... – mcintyre321 2013-02-14 09:21:39

回答

2

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> 
+1

这么简单而且有用。我想知道这是否为OP工作。我只是把一个项目从NAnt切换到了MSBuild,到目前为止我的印象非常深刻。 – harpo 2013-09-02 05:04:32

相关问题