首页 > 解决方案 > ASP.NET Core & SPA - 当客户端位于服务器文件夹之外时,客户端文件未发布

问题描述

我有一个项目,它有单独的客户端和服务器文件夹,我的目标是在服务器的发布过程中包含客户端文件。文件夹结构如下所示

|- server
|  |- src
|     |- MyProject
|        |- MyProject.csproj
|- client
   |- src
      |- dist

SpaRoot使用在我的情况下定义的默认 SPA 模板../../../client/src/和以下项目组定义

<ItemGroup>
    <DistFiles Include="$(SpaRoot)dist\**; $(SpaRoot)dist-server\**" />
    <DistFiles Include="$(SpaRoot)node_modules\**" Condition="'$(BuildServerSideRenderer)' == 'true'" />
    <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    </ResolvedFileToPublish>
</ItemGroup>

从日志中我可以看到这导致将文件复制到其他地方Copying file from "C:\MyProject\client\src\dist\img\ic_mail.svg" to "C:\MyProject\server\src\MyProject\obj\Release\client\src\dist\img\ic_mail.svg".,而目标路径应该是C:\MyProject\server\src\MyProject\obj\Release\netcoreapp3.1\PubTmp\Out\appsettings.Development.json. 我假设它是由不同的父目录引起的,因为共同的父级是层次结构的 3 级,并且文件也被复制到比应有的高 3 级的目录。

我尝试为SpaRootwith 加上前缀$(ProjectDir),但这没有帮助。我的目标是将文件从dist文件夹复制到wwwroot发布文件夹的根目录。我试图调整ResolvedFileToPublish,但我无法检索项目的相对路径(相对于dist文件夹)。

编辑:基于 csproj 的解决方法是将文件手动复制到wwwroot挂钩中BeforeTargets。这会产生任何不可预见的问题吗?(主要是<ClientDistFile/>

<ItemGroup>
    <ClientDistFiles Include="$(SpaRoot)dist/**/*.*"/>
</ItemGroup>

<Target Name="PublishRunWebpack" BeforeTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec WorkingDirectory="$(SpaRoot)" Command="yarn install" />
    <Exec WorkingDirectory="$(SpaRoot)" Command="yarn build:$(TargetEnvironment)" />

    <Copy
        SourceFiles="@(ClientDistFiles)"
        DestinationFiles="@(ClientDistFiles->'wwwroot\%(RecursiveDir)%(Filename)%(Extension)')"
    />
</Target>

标签: msbuildcsprojmsbuild-task

解决方案


推荐阅读