创建条件NuGet包

时间:2014-05-21 09:47:08

标签: c# .net vb.net powershell nuget

我已经在c#中创建了一个自定义程序集,它将被许多不同的现有系统使用,有很多配置涉及使这个程序集与我们的系统一起使用,以便使事情变得更容易,我们决定创建一个本地NuGet服务器并将程序集滚动到NuGet包中。

这非常有效,我们能够添加程序集所需的所有依赖项,并添加web.config.transform文件以合并到所需的任何其他节点中。

这是我们遇到第一个绊脚石......

首先,正如我之前提到的,程序集是用c#编写的,我们测试运行的应用程序是用VB.Net编写的。当我们在程序集中使用log4net时,我们已经实现了WebActivatorEx以确保在应用程序启动时初始化,这意味着我们有一个AppStart类,它位于App_Start文件夹中。但是,在参考WebActivatorEx文档后,我们注意到如果项目是网站网络应用程序相关联,AppStart类必须参加在App_Code文件夹内而不是App_Start文件夹中,还必须使用PostApplicationStartMethod而不是PreApplicationStartMethod

同样由于AppStart类是用c#编写的,并且将位于VB.Net项目中,我们需要将此转换为VB,如果目标项目是VB,以避免弄乱更多配置文件,这是我们的事情正在努力减少。

简而言之,这里的主要问题是:

1.。)我们的NuGet包可以有某种条件行为,即如果它的VB.Net项目在VB.Net中添加AppStart类,如果它的C#,则离开它是C#。

2。)如果项目是网站,则将此AppStart类放在App_Code文件夹中并使用PostApplicationStartMethod,如果项目是Web应用程序,则{{1}在AppStart文件夹中使用App_Start

3。)在初始化log4net而不重写目标应用程序的global.asax

时,这是否是正确的方法

4.。)我知道你可以在NuGet包中运行PowerShell命令,无论如何使用它来确定项目是否是C#|| VB或者我是复杂的事情,我应该为每个场景创建4个不同的NuGet包,但这似乎是完全错误的。

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

2 个答案:

答案 0 :(得分:3)

假设用户没有修改appstart代码,你可以将appstart代码放在已编译的程序集中,这样可以避免使用vb.net与c#。

我也不确定为什么需要使用PostApplicationStart与PreApplicationStart。这不是Web站点与Web应用程序之间的固有差异,您可能希望深入了解这一点。它可能是您特定网站实施中的订购事项。

答案 1 :(得分:2)

听起来你需要利用NuGet中的Init.ps1和Install.ps1支持。来自documentation

  • 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