【问题标题】:Creating a conditional NuGet package创建条件 NuGet 包
【发布时间】:2014-07-09 21:12:53
【问题描述】:

我已经在 C# 中创建了一个自定义程序集,该程序集将被许多不同的现有系统使用,为了让这个程序集与我们的系统一起工作,需要进行很多配置,所以为了让事情变得更容易,我们决定创建本地 NuGet 服务器并将程序集滚动到 NuGet 包中。

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

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

首先,正如我之前提到的,程序集是用 C# 编写的,我们正在测试运行的应用程序是用 VB.Net 编写的。当我们在程序集中使用log4net 时,我们已经实现了WebActivatorEx 以确保它在应用程序启动时被初始化,这意味着我们有一个AppStart 类,它位于App_Start 文件夹中。然而,在参考了WebActivatorEx 文档后,我们注意到如果项目是一个网站 与一个Web 应用程序 相对,那么AppStart 类必须位于@987654327 中@ 文件夹而不是 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 应用程序,则将 AppStart 类放在 App_Start 文件夹中并使用PreApplicationStartMethod.

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我也不确定为什么需要使用 PostApplicationStart 与 PreApplicationStart。这不是网站与 Web 应用程序之间的固有差异,您可能需要更深入地研究这一点。这可能是实施您的特定网站时的顺序。

    【讨论】:

    • 我认为 OP 指的是您不能在网站中使用 PreApplicationStartMethod 的事实,因为当该方法发生火灾时,App_Code 文件夹甚至还没有编译。 https://github.com/davidebbo/WebActivator 但是 OP 需要考虑是否真的有必要尽早初始化 log4net
    • 具体来说,我的意思是编译的程序集并不重要。这是一个很好的观点@generalexception
    • 啊,公平点,因为程序集已经编译,所以 PreApplicationStartMethod 仍然可以正常工作?
    • 是的,这正是 Razor 使用已注册语句获取默认值的方式。它显然适用于网站场景。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多