需要自定义 nuget 包帮助
Posted
技术标签:
【中文标题】需要自定义 nuget 包帮助【英文标题】:Custom nuget package help needed 【发布时间】:2018-01-17 10:01:14 【问题描述】:您好,我想知道我将如何处理这种情况:
我有一个带有调试和发布配置的 .Net PCL 库 我想用它创建一个包含两个配置输出的 nuget 包。 我想使用 VSTS 作为 Debug 构建的符号服务器。 我想在安装包时使用所选配置切换到正确的程序集。我关注了this answer,但我 从未将目标文件集成到使用的 csproj 文件中。 版本在那里设置为固定数字?
这是我的 nuspec 文件内容:
<?xml version="1.0"?>
<package >
<metadata>
<id>My.Assembly</id>
<version>1.0.0.0</version>
<title>A Library</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>A Library</description>
<releaseNotes>Some release notes.</releaseNotes>
<copyright>Copyright 2018</copyright>
<!-- <tags>Tag1 Tag2</tags> -->
</metadata>
<files>
<file src="bin\**" target="lib" />
<file src="*.targets" target="build" />
</files>
</package>
这里建议做什么?
(使用 NuGet 版本:4.4.1.4656)
【问题讨论】:
我已经更新了我的答案,你可以看看它是否对你有帮助。 AFAIK,NuGet 包通常只包含一组特定目标框架的程序集。它并不是真正设计用于发布调试和发布版本。通常,您不会向最终用户发布应用程序的调试版本和单独的发布版本。如果你坚持,你可以检查下面的解决方法。 【参考方案1】:但我从未将目标文件集成到使用的 csproj 文件中。
不确定为什么您无法将目标文件集成到消费 csproj 文件中,如果 .targets
文件位于 nuget 包中的 build 文件夹下,那么当您将此 nuget 包添加到项目时,.targets
文件将被集成到使用的 csproj 文件中。
首先要确保 nuget 包正确:
这是我的.nuspec
文件:
<?xml version="1.0"?>
<package >
<metadata>
<id>My.Assembly</id>
<version>1.0.0</version>
<authors>Admin</authors>
<owners>Admin</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package description</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2018</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
<files>
<file src="bin\**" target="lib" />
<file src="*.targets" target="build" />
</files>
</package>
您应该确保.targets
文件与您的.nuspec
文件位于同一文件夹中,在这种情况下,此命令src="*.targets"
可以将.targets
文件包含到nuget 中包。
注意: .targets 文件的名称必须与您的包的 ID 匹配,根据您的情况,.targets 的名称必须是 My。 Assembly.targets。
打包.nuspec
后,会得到如下结构的nuget包:
然后将这个包安装到你的项目中,安装后卸载项目,编辑项目文件,在.csproj
文件中,会导入如下代码:
<Import Project="..\packages\My.Assembly.1.0.0\build\My.Assembly.targets" Condition="Exists('..\packages\My.Assembly.1.0.0\build\My.Assembly.targets')" />
现在,.targets
文件集成到消费 csproj 文件中。
另外,这个解决方案存在一个问题,因为lib文件夹中的dll会自动添加为引用,在项目文件中创建以下内容:
<Reference Include="My.Assembly, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\My.Assembly.1.0.0\lib\Release\My.Assembly.dll</HintPath>
</Reference>
所以我们不能在 lib 文件夹中设置 dll 文件,我们可以将 dll 文件设置到 tools 文件夹中,然后在 .targets 文件中添加一个目标,以便在构建之前将 dll 文件从 tools 文件夹复制到 lib 文件夹项目:
<files>
<file src="bin\Debug\My.Assembly.dll" target="lib\net\$(Configuration)\My.Assembly.dll" />
<file src="bin\**" target="tools" />
<file src="*.targets" target="build" />
</files>
有关详细信息,您可以参考您引用的线程中的 Arie R 的答案:
How to create a nuget package with both release and debug dll's using nuget package explorer?
希望这会有所帮助。
【讨论】:
感谢您的回答 Leo!我已经设法让它工作了。我不知道 lib 中的程序集在 csproj 中作为参考添加,谢谢。但我认为内容是一个更好的地方。我现在正在努力使用目标框架......当我取得更多进展时,我会更新我的问题。 @grmbl,您能否发布您的解决方案作为答案并在 SO 限制后接受它?这对阅读此线程的其他社区成员可能是有益的。谢谢。以上是关于需要自定义 nuget 包帮助的主要内容,如果未能解决你的问题,请参考以下文章
如果您在c#中的不同路径中使用它,则自定义NuGet不会提供所有方法