我有一个.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" />
但是,第一次发生复制时,仍然不会将复制的文件添加为嵌入式资源。我想知道这是否是嵌入式资源的特定问题?
答案 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
任务放在相同的自定义目标中,似乎可以确保在复制文件后 之前,它不会尝试嵌入资源。