是否可以为以下文件的输出指定不同的文件夹?
<Content Include="test.stl">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
是否可以为以下文件的输出指定不同的文件夹?
<Content Include="test.stl">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
可以使用/ itemsLink
上的元数据指定不同的输出文件夹:None
Content
<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" />
您可以,但不能使用“内容”。这取决于项目任务,但大多数你可以破解的内置任务,不值得麻烦或副作用。
有一个基本的老旧路径来处理这个:) 如果你正在做.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" />
此功能未内置到内容项中。但是您可以通过在项目文件中添加目标来实现它。
在您的项目中,您目前拥有以下内容:
<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
无法另外指定输出文件夹 AFAIK,但您可以在构建之前或之后复制文件。