如何使用.NET Core csproj复制链接的内容文件?

3

我正在参考这篇文章,试图在每次构建之前复制链接的文件:

<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
    <Copy SourceFiles="%(Content.Identity)" 
          DestinationFiles="%(Content.Link)" 
          SkipUnchangedFiles='true' 
          OverwriteReadOnlyFiles='true' 
          Condition="'%(Content.Link)' != ''" />
 </Target>

这似乎无法在新的.NET Core csproj工具中工作。请问有没有等价的目标可用?
编辑:csproj内容示例
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Features>IOperation</Features>
    <Configurations>Debug;Release;Template</Configurations>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="..\MyRefProject\ChangeTypes.cs" Link="ChangeTypes.cs" />
    <Compile Include="..\MyRefProject\Parser.cs" Link="Parser.cs" />
    <Compile Include="..\MyRefProject\Calculator.cs" Link="Calculator.cs" />
    <Compile Include="..\MyRefProject\Converter.cs" Link="Converter.cs" />
  </ItemGroup>
</Project>

您想将内容复制到本地项目开发文件夹还是输出目录?如果选择本地项目文件夹:在基于 SDK 的 csproj 中,当下一次运行自动检测文件并且相对路径与链接相同时,这可能会导致重复的输出路径错误。 - Martin Ullrich
我想复制到本地项目dev文件夹。我已经实现了Marc下面的建议,似乎可以工作。如果出现问题,您认为它们会是间歇性的吗? - ket
我应该澄清一下 - 我想将文件从它们实际存在的项目文件夹复制到它们链接的项目文件夹中。我这样做的原因是我正在使用DocFx为其中一个项目生成文档,而不是另一个项目。 - ket
如果将项目项设置为复制到输出目录,可能会导致冲突(因为链接元数据和项目文件夹中项目项的相对路径都将导致相同的输出路径)。 - Martin Ullrich
1个回答

4
在目标层级应该指定一个条件,但在这种情况下这并没有帮助,因为您不能使用元素的元数据作为条件。此外,您还需要提供一个输出路径。您的示例仅会将链接的内容复制到项目目录中,而不是它的输出目录。
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
<Copy SourceFiles="%(Content.Identity)" 
        DestinationFiles="$(OutputPath)\%(Content.Link)" 
        SkipUnchangedFiles="true" 
        OverwriteReadOnlyFiles="true" />
</Target>

关于Copy任务的文档可以在这里找到

我使用Visual Studio 2017进行了测试,其中包括两个简单的控制台项目。第二个项目包含几个文本文件。第一个项目还通过内容链接引用了这些文件。这是第一个项目的.csproj文件:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <Content Include="..\Project2\ReadMeFirst.txt" Link="ReadMeFirst.txt" />
        <Content Include="..\Project2\ReadMeSecond.txt" Link="ReadMeSecond.txt" />
    </ItemGroup>
    <Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
        <Copy SourceFiles="%(Content.Identity)" 
            DestinationFiles="$(OutputPath)\%(Content.Link)" 
            SkipUnchangedFiles="true" 
            OverwriteReadOnlyFiles="true" />
    </Target>
</Project>

1
我可以做到这一点,并且它有效。然而,我最终创建了一个SourceFiles项目集合,手动添加链接的文件。顶部的示例似乎可以自动检测所有链接的文件并复制它们,而无需每次添加链接文件时更新.csproj。那就是我感兴趣的特定功能 - 你知道有什么方法可以做到吗? - ket
糟糕,我的错。我刚刚意识到这只对我有效,因为我在测试时只有一个链接文件。你可以提供你的.csproj文件副本吗?我已经修复了它,但想确保它能在你的设置中正常工作。 - Marc LaFleur
没问题。我在编辑中添加了经过清理的 .csproj 内容。 - ket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接