复制文件以用作嵌入式资源

时间:2019-08-29 19:27:39

标签: .net-core msbuild csproj

我有一个.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" />

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

根据this的答案,我找到了一种解决方法:

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

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