【发布时间】: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` 文件夹中删除的项目目录中的文件。