创建有条件的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,以避免混淆更多的配置文件,这是我们试图最小化的东西。

总之,这里的主要问题是:

  1. 我们的NuGet包能有某种条件行为吗,即如果它是VB。Net项目在VB中添加AppStart类。. Net,如果是c#,就保留c#。

  2. 如果项目是一个网站,将AppStart类放在App_Code文件夹中并使用PostApplicationStartMethod,如果项目是一个web应用程序,将AppStart类放在App_Start文件夹中并使用PreApplicationStartMethod

  3. 在不重写目标应用程序的global.asax的情况下,这是初始化log4net的正确方法吗

  4. 我知道你可以在NuGet包内运行PowerShell命令,是否有使用这个来确定项目是c# || VB还是我使事情复杂化,我应该简单地为每个场景创建4个不同的NuGet包,但这似乎是完全错误的。

我将等待并欢迎任何建议或意见。

创建有条件的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