创建有条件的 NuGet 包

4
我已经用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.Net项目中,因此我们需要将其转换为VB,仅在目标项目为VB时才进行转换,以避免处理更多的配置文件,这是我们正在尝试最小化的事情之一。
简而言之,这里的主要问题是:
1.我们的NuGet包是否可以有某种条件行为,即如果它是VB.Net项目,请将AppStart类添加到VB.Net中,如果是C#,则保留为C#。
2.如果项目是网站,则将此AppStart类放置在App_Code文件夹中并使用PostApplicationStartMethod,如果项目是Web应用程序,则将AppStart类放置在App_Start文件夹中并使用PreApplicationStartMethod。
3.在初始化log4net而无需重新编写目标应用程序的global.asax方面,这是否是正确的方法?
4.我知道您可以在NuGet包内运行PowerShell命令,是否有任何方式使用此来判断项目是C#还是VB,还是我正在使事情变得复杂,应该只为每种情况创建4个不同的NuGet包,但这似乎是错误的。
2个回答

3
假设用户没有修改appstart代码,可以将其放入一个已编译的程序集中,这样就避免了VB.NET与C#之间的区别。
我也不确定为什么需要使用PostApplicationStart而不是PreApplicationStart。这不是Web Site与Web应用程序之间固有的区别,您可能需要深入了解一下。在您特定的Web Site实现中,这可能是一个排序问题。

1
我认为OP指的是在Web站点中无法使用PreApplicationStartMethod,因为当该方法触发时,App_Code文件夹甚至还没有编译。然而,OP需要考虑是否真的有必要这么早初始化log4net - general exception
1
具体来说,我指的是对于编译后的程序集来说这并不重要。@generalexception提出了一个非常好的观点。 - Yishai Galatzer
啊,说得有道理。因为汇编已经编译好了,所以 PreApplicationStartMethod 仍然可以正常工作吗? - general exception
1
是的,这正是Razor获取默认使用语句注册的方式。显然,在网站场景中它是有效的。 - Yishai Galatzer

2
听起来你需要利用NuGet中的Init.ps1和Install.ps1支持。从他们的文档中可以看到:
  • Init.ps1在解决方案中第一次安装包时运行
  • Install.ps1在项目中安装包时运行。
    • $project是对EnvDTE项目对象的引用,表示安装软件包的项目。
你应该能够使用这些脚本,特别是特殊变量$project,来确定你正在安装软件包的项目类型,并对项目代码进行适当的调整。你还可以在“程序包管理器控制台”中使用辅助cmdlet Get-Project来获取将传递给Install.ps1脚本的EnvDTE对象的引用。这应该有助于查看不同的属性并构建你的条件逻辑。
例如:
PM> $p = Get-Project
PM> $p.Type
C#

参考:http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#powershell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接