排除从.NET标准中的nuget包生成的库
请容忍我,这是一个不寻常的情况。 我的解决方案中有4个项目。最上面的项目引用了其他3个项目。其他3个项目都没有相互引用。所以架构是这样的: 现在,当我构建项目A时,我希望它生成一个包含项目B、C和D的nuget包,而不是项目A。因为这是在.NET标准中,我可以配置项目A的“包”选项卡,通过选中“在构建时生成nuget包”选项,在构建时自动生成nuget包。然后,我可以让它包含B,C和D对A的csproj文件进行以下更改:排除从.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
<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->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->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 "A.nuspec"" />
</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,但它不会让我打包一个没有任何项目的项目-这并不奇怪。