排除从.NET标准中的nuget包生成的库

排除从.NET标准中的nuget包生成的库,nuget,.net-standard,.net-standard-2.0,Nuget,.net Standard,.net Standard 2.0,请容忍我,这是一个不寻常的情况。 我的解决方案中有4个项目。最上面的项目引用了其他3个项目。其他3个项目都没有相互引用。所以架构是这样的: 现在,当我构建项目A时,我希望它生成一个包含项目B、C和D的nuget包,而不是项目A。因为这是在.NET标准中,我可以配置项目A的“包”选项卡,通过选中“在构建时生成nuget包”选项,在构建时自动生成nuget包。然后,我可以让它包含B,C和D对A的csproj文件进行以下更改: <ItemGroup> <ProjectRef

请容忍我,这是一个不寻常的情况。 我的解决方案中有4个项目。最上面的项目引用了其他3个项目。其他3个项目都没有相互引用。所以架构是这样的:

现在,当我构建项目A时,我希望它生成一个包含项目B、C和D的nuget包,而不是项目A。因为这是在.NET标准中,我可以配置项目A的“包”选项卡,通过选中“在构建时生成nuget包”选项,在构建时自动生成nuget包。然后,我可以让它包含B,C和D对A的csproj文件进行以下更改:

<ItemGroup>
    <ProjectReference Include="..\B.csproj">
      <PrivateAssets>all</PrivateAssets>
    </ProjectReference>
    <ProjectReference Include="..\C.csproj">
      <PrivateAssets>all</PrivateAssets>
    </ProjectReference>
    <ProjectReference Include="..\D.csproj">
      <PrivateAssets>all</PrivateAssets>
    </ProjectReference>
  </ItemGroup>

  <PropertyGroup>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
    <Version>1.0.0-beta</Version>
    <PackageId>A</PackageId>
    <Company></Company>
    <Product>A</Product>
    <Description></Description>
    <Authors></Authors>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

  <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
    <ItemGroup>
      <BuildOutputInPackage    Include="@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')-&gt;WithMetadataValue('PrivateAssets', 'all'))" />
    </ItemGroup>
  </Target>

全部的
全部的
全部的
$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage
1.0.0-beta
A.
A.
真的
理想情况下,我希望添加一行以从nuget包中删除.dll。这可能吗?是一个包装器项目,消费代码永远不需要使用它。B、C和D不可能相互参照

更新 我就是这样解决的(谢谢@tom redfern)

我手动创建了一个nuspec文件:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>A</id>
    <version>1.0.0-beta</version>
    <authors>Foo</authors>
    <owners>Bar</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>A package</description>
    <dependencies>
      <group targetFramework=".NETStandard2.0">    
      </group>
    </dependencies>
  </metadata>
  <files>
    <file src="bin\Release\netstandard2.0\B.dll" target="lib\netstandard2.0\B.dll" />
    <file src="bin\Release\netstandard2.0\C.dll" target="lib\netstandard2.0\C.dll" />
    <file src="bin\Release\netstandard2.0\D.dll" target="lib\netstandard2.0\D.dll" />
  </files>
</package>

A.
1.0.0-beta
福
酒吧
假的
包裹
然后,在我的.csproj文件中,我将以下内容放在生成后自动打包:

 <Target Name="__PackNuGetPackage" AfterTargets="Build">
    <Exec Command="$(NugetPackage)nuget.exe pack &quot;A.nuspec&quot;" />
  </Target>

您可以通过使用文件来实现这一点。当您需要绝对控制nuget pack进程时,请使用nuspec。一个简单的nuspec文件:

<package >
  <metadata>
    <id>MyPackage</id>
    <version>1.0</version>
    <authors>Something</authors>
    <owners>Something</owners>
    <description>Somthing</description>
    <copyright></copyright>
    <dependencies>
       <!-- any nuget package dependencies -->
       <dependency id="AnotherPackage" version="2019.2.4.1" />
    </dependencies>
  </metadata>
  <files>
    <!-- this is where you can have complete control over which assemblies get added to your package. You can add them individually pr using wildcards. -->
    <file src="..\obj\**\*.dll" target="lib" />
  </files>
</package>

我的包裹
1
某物
某物
肮脏的
创建.nuspec文件后,将其添加到解决方案中,然后让“Nuget Pack”构建步骤读取nuspec文件而不是项目文件。

使用专利(1)elite(2)调试技能,我们可以确定是否可以不手动创建和维护nuspec文件

首先,让我们从一开始。它说“msbuild-t:pack的功能相当于dotnetpack”。因此,第一个提示是,它只是运行MSBuild目标

因此,运行
dotnet msbuild my.csproj-pp:pp.txt
。此“预处理”(计算所有MSBuild导入语句并将结果写入单个文件)csproj(仅为标准MSBuild文件)。然后搜索pack目标,并向上滚动,直到找到导入的文件的文件名。我们看到它是
NuGet.Build.Tasks.Pack.targets
,而且由于NuGet在GitHub上是开源的

搜索
NuGet.Build.Tasks.Pack.targets
中的
条件
,要查看NuGet团队提供了哪些扩展性选项,请参见
true
。因此,csproj中的设置
false
可能会起作用

(1) 非专利


(2) 标准,但由于人们修改MSBuild文件的频率远不及C#,因此这些技能和工具并不广为人知

,因此您想将正在打包的库…从打包中排除吗?是的!就像我说的,这是一个不寻常的场景。感谢你的建议-我尝试将IncludeFildoutput设置为false,但它不会让我打包一个没有任何项目的项目-这并不奇怪。