我可以指定MSBuild <Content>标记的输出路径吗?

abe*_*nci 10 .net msbuild visual-studio-2010

是否可以为以下文件的输出指定不同的文件夹?

<Content Include="test.stl">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ich 15

可以使用/ items Link上的元数据指定不同的输出文件夹:NoneContent

<Content Include="test.stl">
  <Link>some\folder\%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Run Code Online (Sandbox Code Playgroud)

在include语句中使用通配符时,这也是保留目录层次结构的方法,即使对于来自项目目录外部的文件也是如此:

<Content Include="..\shared\**\*">
  <Link>some\folder\%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Run Code Online (Sandbox Code Playgroud)

在使用2.0.0+ SDK的基于SDK的项目(ASP.NET Core/.NET Core/.NET Standard项目的默认项目)中,使用LinkBase元数据可以实现相同的目标:

<Content Include="..\shared\**\*" LinkBase="some\folder" CopyToOutputDirectory="PreserveNewest" />
Run Code Online (Sandbox Code Playgroud)


Cel*_*ess 8

您可以,但不能使用"内容".这取决于项目任务,但你可以入侵的大多数内置的任务,值得麻烦或副作用.

有一个基本的磨损路径来处理这个:)这也避免了令人讨厌的PostBuild cmd shell方式,如果你正在做.Net,并使用actuall构建过程.

我没有看到这样的任何其他答案,使用严格的MSBuild,我认为OP问题的核心是.这是核心概念,也是最短的路径,baring找到一个具有"相对于outputpath"路径参数且没有副作用的项类型.

1)后期处理方式:

<ItemGroup>
  ...
  <MyTargets Include="test.stl"/>
  ...
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

然后在底部(使用你所追求的任何路径):

<PropertyGroup>
  <MyDeployDir>$(SolutionDir)$(Configuration)</MyDeployDir>
  <MyOtherDeployDir>$(SolutionDir)$(Configuration)\Templates</MyDeployDir>
</PropertGroup>
Run Code Online (Sandbox Code Playgroud)

然后你现有的 MS版本包括(不要添加它,在这里作为标记):

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Run Code Online (Sandbox Code Playgroud)

然后''构建':

<Target Name="AfterBuild">
  <Copy SourceFiles="@(MyTargets)" DestinationFolder="$(MyDeployDir)" SkipUnchangedFiles="true" />
  <Copy SourceFiles="@(MyOtherTargets)" DestinationFolder="$(MyOtherDeployDir)" SkipUnchangedFiles="true" />
  <Copy SourceFiles="@(MyTargets2)" DestinationFolder="$(MyDeployDir)\IHeardYourMomLikesGrapeNuts" SkipUnchangedFiles="true" />
</Target>
Run Code Online (Sandbox Code Playgroud)

最基本的问题是项目项目默认情况下不执行任何操作,它们具有"内容"或"MyTarget"类型.它的那些类型会说明会发生什么.您可能能够找到具有所需内容的任务,类型或构建脚本包含,但就构建期间该文件将发生的情况而言,项目组中的项目没有任何内在因素.以上是专门建造的"任务"的力量之间的平衡,但没有遇到任何麻烦.

一旦你添加

 <ItemGroup>
    <MyOutFiles Include="xxx.xxx" />
Run Code Online (Sandbox Code Playgroud)

一次到项目文件,它将出现在任何文件的BuildAction列表中,您可以在任何文件上设置,而无需手动编辑proj文件.


2)一步到位

在MSBuild的更高版本中,您可以在'AfterBuild'目标中嵌入'ItemGroup'并执行上述操作或执行其他奇特的操作而不触及文件的其余部分.这允许例如使用简单的Include抓取构建的结果并将其替换到其他位置.这一切都没有做RoboCopy任何事情或诉诸更复杂的构建目标函数处理.

<Target Name="AfterBuild">
  <ItemGroup>
    <MyOutFiles Include="$(OutDir)*.*" />
  </ItemGroup>
  <Copy SourceFiles="@(MyOutFiles)" DestinationFolder="$(SolutionDir)\Application" SkipUnchangedFiles="true" />
Run Code Online (Sandbox Code Playgroud)

编辑(由于投票结果?,海报评论自删除):

为消除歧义可能的方法并重申,此方法不使用MSBuild'函数'或替代任务,如'RoboCopy',而是用于显示更纯粹的MSBuild样式,使用核心功能,如用于制作项目任务,如'内容'本身.

问题是我可以为以下文件指定'不同的文件夹',我可以为内容标记执行此操作.您可以使用MSBuild函数重新路由所有BuildAction,但是我不相信这是个问题.

你可以这样做是上面所示的一步,所以我不认为这更复杂,相信它更容易阅读.下面是简短形式,让他创建自己的BuildAction,无论如何都可以处理.所以不,你不能告诉'内容'为标记为'内容'的特定文件选择另一个文件夹,但你可以做一个相当容易的另一个构建操作.您还可以将元信息注入到StlFiles标记中,该标记指示您可以在标记本身上设置它的操作,或者让StlFiles在流程的前面像内容一样挂钩,但这更复杂.

<StlFiles Include="test.stl" />         
...
<Target Name="AfterBuild">
  <Copy SourceFiles="@(StlFiles)" DestinationFolder="$(SolutionDir)\Release\MyTypes" SkipUnchangedFiles="true" />
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

6747 次

最近记录:

8 年 前