【问题标题】:Copy files for use as embedded resources复制文件以用作嵌入式资源
【发布时间】:2019-08-29 19:27:39
【问题描述】:

我有一个 .NET Core 项目,在构建之前,我想从项目文件夹之外复制文件,以便将它们用作嵌入式资源。

我的 csproj 文件如下所示:

<Target Name="CopyResources" BeforeTargets="PreBuildEvent">
    <Copy SourceFiles="$(ProjectDir)..\..\config\00.sql" DestinationFolder="$(ProjectDir)\Resources\Sql" />
    <Copy SourceFiles="$(ProjectDir)..\..\config\01.sql" DestinationFolder="$(ProjectDir)\Resources\Sql" />
    <Copy SourceFiles="$(ProjectDir)..\..\config\02.sql" DestinationFolder="$(ProjectDir)\Resources\Sql" />
</Target>

<ItemGroup>
    <EmbeddedResource Include="Resources\Sql\*.sql" />
</ItemGroup>

但是,似乎存在竞争条件 - 文件按预期复制到目标文件夹,但在第一次构建时没有作为嵌入式资源包含在内。它们包含在后续构建中 - 构建目标似乎正在异步执行,并且在构建开始之前没有完成。

我尝试将 BeforeTargets 更改为 Compile 而不是 PreBuildEvent,但得到了相同的行为。

我也尝试使用Exec 任务,但得到了相同的结果:

<Exec Command="copy $(ProjectDir)..\..\config\*.sql $(ProjectDir)\Resources\Sql" />

有没有办法确保BeforeTargets 构建目标实际上在指定目标之前执行?

更新 所以我想在Exec 任务中添加一个睡眠,我可以看到它至少似乎在进入构建阶段之前要等待:

<Exec Command="copy $(ProjectDir)..\..\config\*.sql $(ProjectDir)\Resources\Sql && sleep 5" />

但是,在第一次进行复制时,复制的文件仍然不会被添加为嵌入资源。我想知道这是否是嵌入式资源的特定问题?

【问题讨论】:

  • 如果您真的想使用Copy,请确保从 Copy 的 CopiedFiles 输出参数创建 FileWrites 项目,以便在增量构建期间清理文件并且您不会以您从 `config` 文件夹中删除的项目目录中的文件。

标签: .net-core msbuild csproj


【解决方案1】:

最好使用LinkBase 从项目文件夹外部包含它们。不需要目标和复制步骤。:

<ItemGroup>
  <EmbeddedResource Include="..\..\config\*.sql" LinkBase="Resources\Sql\" />
</ItemGroup>

如果您不想在解决方案资源管理器中看到它们,可以将Visible="False" 添加到EmbeddedResource xml 标记中。

【讨论】:

  • 如果我这样做,嵌入资源的名称是否仍如预期,例如MyAssembly.Resources.Sql.myfile.sql?
  • 是的,逻辑名称默认为链接元数据(从LinkBase 推断+(如果**/ 通配符,则为递归目录)+ 文件名+ .NET Sdk 项目中的扩展名)。如果想要在磁盘上的不同位置、解决方案资源管理器中以及生成程序集中的名称/路径,也可以通过 LogicalName 元数据对其进行自定义)
  • 太好了,这确实按预期工作,谢谢!
【解决方案2】:

我找到了一种解决方法,感谢this 回答:

  <Target Name="EmbedLocal" BeforeTargets="PrepareForBuild">
    <Copy SourceFiles="... " DestinationFolder="... " />
    ... 
    <ItemGroup>
      <EmbeddedResource Include="..."/>
    </ItemGroup>
    ...
  </Target>

EmbeddedResource 任务与Copy 任务放在同一自定义目标中似乎可以确保它不会尝试嵌入资源,直到文件被复制之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2011-10-30
    • 2015-08-12
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多