22

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

<Content Include="test.stl">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
4

4 回答 4

44

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

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

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

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

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

<Content Include="..\shared\**\*" LinkBase="some\folder" CopyToOutputDirectory="PreserveNewest" />
于 2017-12-10T10:50:00.240 回答
9

您可以,但不能使用“内容”。这取决于项目任务,但大多数你可以破解的内置任务,不值得麻烦或副作用。

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

我没有看到任何其他像这样的答案,使用 srieght up MSBuild,我认为 OPs 问题的核心是。这是核心概念,也是最短路径,除了找到具有“相对于输出路径”路径参数且没有副作用的项目类型。

1)后期处理风格:

<ItemGroup>
  ...
  <MyTargets Include="test.stl"/>
  ...
</ItemGroup>

然后在底部(使用您之后的任何路径):

<PropertyGroup>
  <MyDeployDir>$(SolutionDir)$(Configuration)</MyDeployDir>
  <MyOtherDeployDir>$(SolutionDir)$(Configuration)\Templates</MyDeployDir>
</PropertGroup>

然后您现有的MS 构建包括(不要添加这个,在这里作为标记):

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

然后是“构建后”:

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

根本问题是项目项目默认情况下不做任何事情,它们的类型类似于“内容”或“我的目标”。它的那些类型说会发生什么。您可能能够找到包含所需内容的任务、类型或构建脚本,但就构建期间该文件将发生的情况而言,项目组中的项目没有任何内在特征。以上是特制“任务”的力量之间的平衡,但没有任何麻烦。

一旦你添加

 <ItemGroup>
    <MyOutFiles Include="xxx.xxx" />

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


2) 一步到位

在更高版本的 MSBuild 中,您可以在“AfterBuild”目标中嵌入一个“ItemGroup”,然后执行上述操作或执行其他花哨的操作,而无需触及文件的其余部分。例如,这允许使用简单的 Include 获取构建结果并将其替换到其他地方。这一切都不需要做任何 RoboCopy 或诉诸更复杂的构建目标函数处理。

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

编辑(由于否决票?,海报评论自删除):

为了消除可能的方法的歧义并重申,此方法不使用 MSBuild“功能”或替代任务(如“RoboCopy”),而是使用核心功能显示更纯粹的 MSBuild 风格,就像在制作项目任务(如“内容”)时使用的那样本身。

问题是我可以为以下文件指定一个“不同的文件夹”吗?我可以为内容标签执行此操作吗?您可以使用 MSBuild 函数重新路由所有 BuildAction,但我不相信这是问题所在。

你可以做到这一点,如上所示,所以我认为这不会更复杂,并且更容易阅读。下面是简短的形式,让他可以创建自己的 BuildAction,可以随意处理。所以不,您不能告诉“内容”为标记为“内容”的特定文件选择另一个文件夹,但您可以进行另一个相当容易的构建操作。您还可以将元信息注入到指示操作的 StlFiles 标签中,以便您可以在标签本身上设置它,或者像内容一样在流程的早期使用 StlFiles 挂钩,但这更复杂。

<StlFiles Include="test.stl" />         
...
<Target Name="AfterBuild">
  <Copy SourceFiles="@(StlFiles)" DestinationFolder="$(SolutionDir)\Release\MyTypes" SkipUnchangedFiles="true" />
于 2012-09-01T22:52:33.357 回答
1

此功能未内置到内容项中。但是您可以通过在项目文件中添加目标来实现它。

在您的项目中,您目前拥有以下内容:

<ItemGroup>
  <Content Include="test.stl">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

假设您希望将一个特定文件复制到其他位置,请将其添加到末尾(在结束“项目”标记之前):

<Target Name="CopyStl" AfterTargets="AfterBuild">
  <!-- One or the other of these Copy tasks should do what you want --> 
  <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" />
  <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" />
</Target>

如果您想添加更多文件以复制到同一文件夹,请尝试以下操作:

<Target Name="CopySomeFiles" AfterTargets="AfterBuild">
  <!-- One or the other of these Copy tasks should do what you want --> 
  <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" />
  <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" />
</Target
于 2012-09-05T05:22:45.090 回答
0

无法另外指定输出文件夹 AFAIK,但您可以在构建之前或之后复制文件。

于 2012-09-01T23:07:56.750 回答