pik*_*usp 10 msbuild csproj msbuild-task
我有一个项目,它有单独的客户端和服务器文件夹,我的目标是在服务器的发布过程中包含客户端文件。文件夹结构如下所示
|- server
| |- src
| |- MyProject
| |- MyProject.csproj
|- client
|- src
|- dist
Run Code Online (Sandbox Code Playgroud)
使用默认的 SPA 模板SpaRoot,在我的例子中定义了../../../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>
Run Code Online (Sandbox Code Playgroud)
从日志中我可以看到这会导致将文件复制到其他地方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 级的目录中。
我尝试在 前面加上前缀SpaRoot,$(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>
Run Code Online (Sandbox Code Playgroud)
小智 0
我遇到了类似的问题,这是解决该问题的代码:
<ItemGroup>
<DistFiles Include="$(SpaRoot)dist\**"/>
<DistFiles>
<PublishPath>$([System.String]::Copy('%(RelativeDir)').Replace($(SpaRoot)dist, 'wwwroot'))</PublishPath>
</DistFiles>
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.PublishPath)%(DistFiles.FileName)%(DistFiles.Extension)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<ExcludeFromSingleFile>True</ExcludeFromSingleFile>
</ResolvedFileToPublish>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
第四行基本上就是这里的魔力。它将在 DistFiles 中的每个文件上创建新的元数据属性,其中包含发布目录的相对路径。然后它与文件名和扩展名放在第七行。
| 归档时间: |
|
| 查看次数: |
873 次 |
| 最近记录: |