2014-05-21 101 views
4

我已經在c#中創建了一個自定義程序集,這個程序集將被許多不同的現有系統所使用,在獲得這個程序集與我們的系統一起工作中有相當多的配置,更容易,我們決定創建一個本地NuGet服務器並將該程序集轉換爲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項目添加VB中的AppStart類。淨,如果它的C#,把它留作C#。

2)如果該項目是一個網站,地方本級AppStartApp_Code文件夾,並使用PostApplicationStartMethod,如果該項目是一個Web應用程序發生在App_Start文件夾中的AppStart類,並使用PreApplicationStartMethod

3)這是即使在初始化log4net的,而無需重新編寫的目標應用程序的Global.asax中

4)我知道你可以運行NuGet包內的PowerShell命令方面正確的做法,是無論如何用這個來確定項目是否是C#|| VB還是我複雜的東西,我應該爲每個場景簡單地創建4個不同的NuGet包,但這似乎是錯誤的。

我會等待並歡迎任何建議或意見。

回答

3

假設用戶沒有修改AppStart的代碼,你可以把AppStart的代碼在編譯的程序集,這將避免vb.net VS 。 C#。

我也不確定爲什麼你需要使用PostApplicationStart與PreApplicationStart。這不是Web站點與Web應用程序之間的固有區別,您可能想深入瞭解這一點。這可能是實施特定網站時的有序事情。

+1

我認爲OP指的是你不能在網站中使用'PreApplicationStartMethod'這個事實,因爲當這個方法是由於'App_Code'文件夾引發的時候,它甚至沒有編譯過。 'https:// github.com/davidebbo/WebActivator'然而,OP需要考慮的是,這很早就需要初始化'log4net'。 –

+1

具體而言,我的意思是編譯程序集並不重要。這是一個很好的觀點@generalexception –

+0

啊公平點,所以因爲程序集已經編譯,那麼PreApplicationStartMethod仍然可以正常工作? –

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