我有一个项目,可以通过在CSPROJ文件中设置以下选项,直接在Visual Studio中生成NuGet包:
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
这将导致生成的程序包包含所有已标记为“复制到输出目录=不复制”的嵌入式资源文件。
不幸的是,Visual Studio的自动打包程序选择始终将这些文件复制到NuGet程序包中。
为解决这个问题,我一直在研究编辑.NUSPEC文件,并从命令行使用NUGET.EXE创建程序包。
然后我遇到了一个新问题。通过使用NUGET.EXE而不是visual studio,生成的程序包将依赖项部分显示为“不受支持”,这是通过在“ NuGet Explorer”中打开程序包看到的:
以下是用于创建程序包的.bat文件:
c:\nuget\nuget.exe config -Set repositoryPath="%USERPROFILE%\.nuget\packages"
c:\nuget\nuget.exe pack -IncludeReferencedProjects -properties Configuration=Release
这是NUSPEC文件:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>Integrative.Lara</id>
<version>0.5.3</version>
<authors>Pablo Carbonell, Integrative Software LLC</authors>
<owners>Pablo Carbonell, Integrative Software LLC</owners>
<requireLicenseAcceptance>true</requireLicenseAcceptance>
<license type="file">LICENSE</license>
<projectUrl>https://github.com/integrativesoft/lara</projectUrl>
<iconUrl>https://integrative.b-cdn.net/Integrative.ico</iconUrl>
<description>Lara is ...</description>
<copyright>Copyright (c) 2019 Integrative Software LLC</copyright>
<tags>lara, web, html, html5, desktop, gui, cross, framework, mac, osx, platform, ui, blazor, razor</tags>
<repository url="https://github.com/integrativesoft/lara" />
<dependencies>
<group targetFramework=".NETStandard2.0">
<dependency id="Microsoft.AspNetCore" version="2.2.0" exclude="Build,Analyzers" />
<dependency id="Microsoft.AspNetCore.WebSockets" version="2.2.1" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
是否可以解决“不受支持”的目标?我也尝试使用“ netstandard2.0”和其他标识符,但仍然得到相同的“不受支持”。
或者,有没有一种方法可以使用Visual Studio的自动包生成功能,并防止它在包中包含文件?
答案 0 :(得分:1)
如您所见,当您使用nuspec时,您有责任使每件事变得正确。使用NuGet的MSBuild包目标更加容易,因为它可以自动执行创建依赖项之类的工作,包括在组中使用正确的TFM。
NuGet在pack targets上的文档具有与msbuild打包相关的内容(使用dotnet pack
或GeneratePackageOnBuild
时会发生这种情况)。尤其是Including content in a package的部分具有以下示例:
<Content Include="..\win7-x64\libuv.txt">
<Pack>false</Pack>
</Content>
由于文件已嵌入,因此csproj将包含类似<EmbeddedResource Include="whatever.ext" />
的内容。因此,使用文档中的信息,您可以执行<EmbeddedResource Include="whatever.ext" Pack="false" />
,或像文档一样使用多行版本。 MSBuild允许您以任何一种方式设置项目元数据。
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
关于GeneratePackageOnBuild的注释:为您建立构建包很方便,但这意味着,当您进行调试并且需要更改一行代码然后再次进行测试时,您不仅要等待构建,而且还可以打包。如果您的程序包很小,则可能会很快,但仍然会减慢您的“内环”体验。大多数开发人员只需要打包次数就比其生成的次数少得多,因此我建议禁用GeneratePackageOnBuild
,而在您实际需要nupkg时在项目(或解决方案)上运行dotnet pack
。