尽管使用 DebugType=None,Visual Studio 发布仍会生成 .pdb 文件。

5
我正在使用以下发布配置文件从Visual Studio中发布控制台应用程序:
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishProtocol>FileSystem</PublishProtocol>
    <Configuration>Release</Configuration>
    <Platform>x64</Platform>
    <TargetFramework>netcoreapp5.0</TargetFramework>
    <PublishDir>bin\Release\netcoreapp5.0\publish\</PublishDir>
    <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
    <SelfContained>False</SelfContained>
    <PublishSingleFile>True</PublishSingleFile>
    <PublishReadyToRun>True</PublishReadyToRun>
    <IncludeNativeLibrariesForSelfExtract>True</IncludeNativeLibrariesForSelfExtract>

    <DebugType>none</DebugType>
    <DebugSymbols>false</DebugSymbols>
  </PropertyGroup>
</Project>

我的目标是不在发布输出文件夹中生成任何.pdb(调试符号)文件。
这并没有完全按照预期工作。
控制台应用程序项目的.pdb文件未生成——如预期,但引用的业务逻辑项目的调试符号某种原因却被生成了。这是一个错误吗?
我可以通过向业务逻辑库的项目文件添加条件语句来迂回解决此问题,但我想尽可能避免这样做,因为我认为发布应用程序所需的所有相关信息都应存在于发布配置文件中。
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
   <DebugType>none</DebugType>
   <DebugSymbols>false</DebugSymbols>
</PropertyGroup>
1个回答

14
<DebugSymbols>false</DebugSymbols>仅会阻止生成当前项目的pdb文件。如果您的主项目引用了第二个项目,则这些节点将不会阻止在主项目中生成第二个项目的pdb文件。这是按设计来的。而且,如果您想要防止被引用的项目的pdb文件生成到主项目的发布文件夹中,您还应该使用此节点:
<AllowedReferenceRelatedFileExtensions>*.pdb</AllowedReferenceRelatedFileExtensions>

解决方案

在您的pubxml文件中添加以下内容:

<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
<AllowedReferenceRelatedFileExtensions>*.pdb</AllowedReferenceRelatedFileExtensions>

1
这很有趣。我似乎找不到关于这个设置的任何文档。根据它的名称,它的逻辑难道不应该是反过来的吗? - silkfire
1
节点有点特殊。*.pdb-.pdb表示在主项目中排除此类后缀文件,而.pdb表示包括这些文件。有点灵活!没有明显的官方文档来解释这一点。您可以使用我的方法进行测试,并给我们任何反馈。 - Mr Qian
1
所以在你的端上,如果你想要排除引用项目的 pdb 文件,你应该使用 *.pdb - Mr Qian
1
很棒的答案,真的帮了我大忙。它同样适用于Visual Studio 2019 + WinForm + .NET5。 - cheny
我最终做了这件事,但也添加了核选择 <ExcludeFilesFromDeployment>bin\**\*.pdb</ExcludeFilesFromDeployment>,因为这适用于所有已引用的项目,除了正在发布的项目。 - Dan Atkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接