.NET Core发布时OutDir/OutPath未正确设置的问题求助
解决dotnet publish -o指定目录后MSBuild $(OutDir)未更新的问题
我明白你遇到的困扰了——当你执行dotnet publish -o ./dist指定发布目录时,MSBuild的$(OutDir)和$(OutputPath)依然指向默认的bin/Release/netcoreapp2.0/,导致你的模板复制Target没能把文件放到预期的dist目录里。
问题根源
这里的核心是混淆了MSBuild中两个不同的输出属性:
$(OutDir)/$(OutputPath):这是构建(build)阶段的输出目录,dotnet publish会先完成编译构建,把产物放到这个目录,之后再将需要发布的文件复制到最终的发布目录。$(PublishDir):这才是发布阶段的输出目录,对应你通过-o参数指定的路径,也就是你期望的./dist。
解决方案
把你的Target里的$(OutDir)替换成$(PublishDir)即可,修改后的CopyEmailTemplates Target如下:
<Target Name="CopyEmailTemplates" AfterTargets="AfterPublish"> <ItemGroup> <TemplatesFolder Include="Views\EmailTemplates\*.cshtml" /> </ItemGroup> <Copy SourceFiles="@(TemplatesFolder)" DestinationFolder="$(PublishDir)Views\EmailTemplates\" /> </Target>
同时,你可以更新OutputTest Target来验证$(PublishDir)的值:
<Target Name="OutputTest" AfterTargets="AfterPublish"> <Exec Command="echo OutPath: $(OutputPath)" /> <Exec Command="echo OutDir: $(OutDir)" /> <Exec Command="echo PublishDir: $(PublishDir)" /> </Target>
执行dotnet publish -o ./dist后,你会看到PublishDir正确指向./dist/(或系统解析后的绝对路径)。
额外说明
在.NET Core的MSBuild逻辑里,AfterPublish Target确实是在所有发布文件复制到$(PublishDir)之后执行的,所以用这个时机配合$(PublishDir)就能准确把你的模板文件复制到发布目录中。
内容的提问来源于stack exchange,提问作者Pandelis
相关产品推荐
相关产品推荐

