Visual Studio 指定不同的中间目录时生成NuGet

z4bn682m  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(220)

我有一个类库(.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手动打包它?

lyfkaqu1

lyfkaqu11#

指定不同的中间目录时生成NuGet

实际上ClassLibrary.pdb文件存在于c:\outputfolder\bin\debug\net48文件夹下,您可以在路径中找到它。

而且你不必使用nuspec文件和nuget cli,你可以直接在xxx.csproj文件中写入来获得你想要的。
下面是我在xxx.csproj文件中所做的:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
    <OutputPath>c:\outputfolder\bin\debug</OutputPath>
    <BaseOutputPath>c:\intermediatefolder\</BaseOutputPath>
    <IntermediateOutputPath>c:\intermediatefolder\debug\</IntermediateOutputPath>
    <BaseIntermediateOutputPath>$(IntermediateOutputPath)</BaseIntermediateOutputPath>
  </PropertyGroup>
  
  <PropertyGroup>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>  //generate the nupkg during build process automatically
  </PropertyGroup>

  <ItemGroup>
    <None Include="$(OutputPath)ClassLibrary.pdb" Pack="true" PackagePath="lib\$(TargetFramework)"></None>
  </ItemGroup>
  
</Project>

除了之外,因为您在IntermediateOutputPath文件夹下找到了pdb文件,所以如果在outputfolder文件夹中找不到该文件,您也可以使用此命令打包该文件:

<ItemGroup>
        <None Include="$(IntermediateOutputPath)ClassLibrary.pdb" Pack="true" PackagePath="lib\$(TargetFramework)"></None>
 </ItemGroup>

======================

更新1

也许您已经在xxx.csproj文件的头上定义了一个名为<CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>的属性,或者在项目文件夹的父目录上的一个名为Directory.Build.props的文件中定义了一个名为<CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>的属性,这将阻止项目生成xxx.pdb文件。如果是这样,您应该删除该节点。

在我这边,我在我的xxx.csproj文件中定义了该节点,它将导致您描述的行为。

因此建议删除该节点或将其值更改为true

<Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
    
    //delete this node or just change its value to true

<CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory> 
      </PropertyGroup>
      <PropertyGroup>
        <TargetFramework>net472</TargetFramework>
        
      </PropertyGroup>
    
      <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>  
      </PropertyGroup>
    
    
      <ItemGroup>
        <None Include="$(OutputPath)test_3.pdb" Pack="true" PackagePath="lib\$(TargetFramework)"></None>
      </ItemGroup>
      
    </Project>

然后,当您更改它时,请记住关闭VS示例,删除outputfolderintermediatefolder文件夹,然后重新启动项目。
之外,如果不想打包xxx.pdb文件,也可以删除该文件的include xml节点。发生该错误的原因是要打包它。如果要从打包中排除pdb文件,只需删除该节点即可。

<ItemGroup>
            <None Include="$(OutputPath)ClassLibrary.pdb" Pack="true" PackagePath="lib\$(TargetFramework)"></None>
</ItemGroup>

如果你想把它打包,按照我上面的步骤。

更新2

经过深入研究,我发现dotnet pack(用于新的sdk格式项目)不能很好地与

<CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>

似乎无论您如何从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)将这些写入文件:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>test</id>
    <version>1.0.0</version>
    <title>me</title>
    <authors>me</authors>
    <owners>me</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>123</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2020</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>

<files>
<file src="C:\intermediatefolder\Debug\net48\xxx.pdb" target="lib\net48"/>
</files>
</package>

然后运行nuget pack以生成nupkg文件。

jckbn6z7

jckbn6z72#

如果您的项目输出根本不应包含PDB文件,而您希望使用dotnet pack(与Visual Studio创建包的方式相同),则可以将以下选项添加到项目文件中,以完全禁用符号生成。

<PropertyGroup>
    <DebugType>None</DebugType>
    <DebugSymbols>false</DebugSymbols>
  </PropertyGroup>

相关问题