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

Copy files for use as embedded resources

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

我的 csproj 文件如下所示:

<Target Name="CopyResources" BeforeTargets="PreBuildEvent">
    <Copy SourceFiles="$(ProjectDir)..\..\config[=10=].sql" DestinationFolder="$(ProjectDir)\Resources\Sql" />
    <Copy SourceFiles="$(ProjectDir)..\..\config.sql" DestinationFolder="$(ProjectDir)\Resources\Sql" />
    <Copy SourceFiles="$(ProjectDir)..\..\config.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" />

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

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

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

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

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

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

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