我有一个类库(.Net framework 4.8,它是用旧的csproj格式生成的,我已经将它迁移到新的csproj格式,如下所示:https://natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/。
该库使用自定义属性表来定义<OutputPath>
标记,以将.dll构建到特定文件夹,并使用<IntermediateOutputPath>
和<BaseIntermediateOutputPath>
标记将中间文件输出到不同的文件夹。例如,调试标记看起来与此类似。
<OutputPath>c:\outputfolder\bin\debug</OutputPath>
<IntermediateOutputPath>c:\intermediatefolder\debug\</IntermediateOutputPath>
<BaseIntermediateOutputPath>$(IntermediateOutputPath)</BaseIntermediateOutputPath>
这非常好用,我可以看到dll在输出目录中,中间文件放在中间目录中。打包失败并出现此错误
error NU5026: The file 'c:\outputfolder\bin\debug\ClassLibrary.pdb' to be packed was not found on disk.
这是有意义的,因为.pdb文件不在输出目录中,而是在中间目录中。我四处搜索,但在VS中找不到任何可以更改定义的选项。有没有办法做到这一点,或者我必须创建nuspec并使用NuGet CLI手动打包它?
2条答案
按热度按时间lyfkaqu11#
指定不同的中间目录时生成NuGet
实际上,
ClassLibrary.pdb
文件存在于c:\outputfolder\bin\debug\net48
文件夹下,您可以在路径中找到它。而且你不必使用nuspec文件和nuget cli,你可以直接在xxx.csproj文件中写入来获得你想要的。
下面是我在
xxx.csproj
文件中所做的:除了之外,因为您在
IntermediateOutputPath
文件夹下找到了pdb文件,所以如果在outputfolder
文件夹中找不到该文件,您也可以使用此命令打包该文件:======================
更新1
也许您已经在
xxx.csproj
文件的头上定义了一个名为<CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>
的属性,或者在项目文件夹的父目录上的一个名为Directory.Build.props
的文件中定义了一个名为<CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>
的属性,这将阻止项目生成xxx.pdb
文件。如果是这样,您应该删除该节点。在我这边,我在我的
xxx.csproj
文件中定义了该节点,它将导致您描述的行为。因此建议删除该节点或将其值更改为
true
。然后,当您更改它时,请记住关闭VS示例,删除
outputfolder
和intermediatefolder
文件夹,然后重新启动项目。除之外,如果不想打包xxx.pdb文件,也可以删除该文件的include xml节点。发生该错误的原因是要打包它。如果要从打包中排除pdb文件,只需删除该节点即可。
如果你想把它打包,按照我上面的步骤。
更新2
经过深入研究,我发现
dotnet pack
(用于新的sdk格式项目)不能很好地与似乎无论您如何从
intermediatefolder
中提取pdb
文件,它总是从dotnet pack
下的输出文件夹中搜索pdb
文件。解决方案
**1)**如果您仍要使用
dotnet pack
(我的方法),而且您可以变更CopyOutputSymbolsToOutputDirectory
属性,您应该设定x1米20英寸
当您打包您项目和创建这样的Nuget包时,如果您的构建过程需要它,您可以将它改回来。
2)Use nuget.exe with nuespec file to pack the project .
首先,删除
xxx.csproj
文件中所有相关打包xml节点a)输入
xxx.csproj
文件所在的项目文件夹的路径。B)在CMD上运行
cd xxx(the path of your project)
c)然后运行
nuget spec
以创建nuspec文件:d)将这些写入文件:
然后运行
nuget pack
以生成nupkg文件。jckbn6z72#
如果您的项目输出根本不应包含PDB文件,而您希望使用
dotnet pack
(与Visual Studio创建包的方式相同),则可以将以下选项添加到项目文件中,以完全禁用符号生成。