创建有条件的NuGet包
本文关键字:NuGet 有条件 创建 | 更新日期: 2023-09-27 18:04:18
我在c#中创建了一个自定义程序集,它将被许多不同的现有系统使用,有相当多的配置涉及到这个程序集与我们的系统一起工作,所以为了使事情变得更容易,我们决定创建一个本地NuGet服务器,并将程序集滚到NuGet包中。
这工作得非常好,我们能够添加组装所需的所有依赖关系,并添加一个web.config.transform文件来合并所需的任何其他节点。
这是我们遇到的第一个障碍…
首先,正如我前面提到的,程序集是用c#编写的,我们正在测试运行的应用程序是用VB.Net编写的。由于我们在程序集中使用log4net
,我们已经实现了WebActivatorEx
,以确保在应用程序启动时对其进行初始化,这意味着我们有一个AppStart
类,它位于App_Start
文件夹。然而,参考WebActivatorEx
文档后,我们注意到,如果项目是一个网站而不是web应用程序, AppStart
类必须位于App_Code
文件夹而不是App_Start
文件夹中,并且必须使用PostApplicationStartMethod
而不是PreApplicationStartMethod
。
同样,AppStart
类是用c#编写的,将放在VB中。只有当目标项目是VB时,我们才需要将其转换为VB,以避免混淆更多的配置文件,这是我们试图最小化的东西。
总之,这里的主要问题是:
-
我们的NuGet包能有某种条件行为吗,即如果它是VB。Net项目在VB中添加
AppStart
类。. Net,如果是c#,就保留c#。 -
如果项目是一个网站,将
AppStart
类放在App_Code
文件夹中并使用PostApplicationStartMethod
,如果项目是一个web应用程序,将AppStart
类放在App_Start
文件夹中并使用PreApplicationStartMethod
。 -
在不重写目标应用程序的global.asax的情况下,这是初始化log4net的正确方法吗
-
我知道你可以在NuGet包内运行PowerShell命令,是否有使用这个来确定项目是c# || VB还是我使事情复杂化,我应该简单地为每个场景创建4个不同的NuGet包,但这似乎是完全错误的。
我将等待并欢迎任何建议或意见。
假设用户没有修改appstart代码,您可以将appstart代码放在已编译的程序集中,这将避免vb.net与c#的冲突。
我也不知道为什么你需要使用PostApplicationStart与PreApplicationStart。这并不是Web站点与Web应用程序之间的内在区别,您可能需要对此进行更深入的研究。
听起来您需要利用Init。ps1和Install。NuGet中的ps1支持。来自他们的文档:
- Init。ps1在解决方案 中第一次安装包时运行。
- 安装。ps1在项目中安装包时运行。
- $project是对EnvDTE项目对象的引用,表示安装包的项目。
您应该能够使用这些脚本,特别是特殊变量$project
来确定您要将包安装到的项目类型,并对项目代码进行适当的调整。您还可以在包管理器控制台中使用帮助器cmdlet Get-Project
来获取对将传递给安装的EnvDTE对象的引用。ps1脚本。这应该有助于查看不同的属性并建立条件逻辑。
PM> $p = Get-Project
PM> $p.Type
C#
参考:http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package powershell