复制文件以用作嵌入式资源
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 标签。
我有一个 .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 标签。