2012-01-19 78 views
1

我有一個debian軟件包,包含文件,控制文件和postinst文件的tar文件。它使用dpkg-deb構建,並使用dpkg正確安裝。debian軟件包內容的運行時安裝目錄

我想要做的修改是在運行時根據在deb文件上運行dpkg -i時將設置的環境變量來確定文件的安裝目錄。我在postinst腳本中回顯出環境變量,我可以看到它的設置正確。

我的問題:

1)是否有可能來動態確定在運行安裝目錄?

2)如果可能的話我該怎麼辦呢?我已閱讀有關規則文件和mypackage.install文件,但我不知道這些是否會允許我完成此操作。

我可以通過將文件複製到posinst腳本中的目標位置來破解它,但如果可能,我寧願以正確的方式進行操作。

在此先感謝!

+0

有一個選項可以傳遞給'dpkg'以使用不同於'/ usr'的根目錄來安裝。 'deb'軟件包在這個意義上沒有「安裝目錄」 - 如果你添加了你現在擁有的東西和你想要的東西的例子,這將有所幫助。理論上你可以從你的'postinst'腳本中移動東西,但我會強烈勸阻你。 – tripleee

+0

好主意。我嘗試使用--instdir =並且它複製了這些文件,但postinst將無法運行,因爲--instdir執行chroot,因此您必須在那裏還有dpkg admin目錄。我也嘗試使用--root和--admindir組合來查看是否可以拆分這兩個目錄。 rpm有一個重定位標誌,所以你可以移動包的位置。我必須有一個動態目錄,因爲這個軟件包必須位於兩個不同嵌入式Linux發行版的不同位置。舉一個例子,假設一個文件位於不同機器上不同位置的tarball中。 –

+0

我會簡單地創建兩個不同的'deb'包,除非文件是conffile。例子仍然有幫助。一個典型的軟件包管理的文件可能類似於'/ usr/lib/yourpackage.so'和一個典型的confeile例如'的/ etc/yourpackage.cfg'。 – tripleee

回答

1

所以這就是我在過去幾周發現的這個問題。

使用預打包的二進制文件,您無法生成運行時確定的目標目錄dynamicall的debian軟件包。我相信如果安裝一個從源代碼構建的軟件包,您可以使用configure來設置安裝目錄,這可能是可能的。但在這種情況下,因爲這些是嵌入式Ubuntu機器,他們沒有製造,所以我沒有追求這樣的選擇。我做了一個非傳統的方法(黑客)來安裝這個工作。由於debian軟件包相對於/ tmp簡單地包含一個相對於/簡單地構建相對於目錄的tar包。然後,在postinst腳本中,您可以確定將檔案中的文件複製到永久位置的位置。

我預計在重新啓動並自動刪除/ tmp下的子目錄後,dpkg可能不知道文件包存在。這不是問題。當我運行'dpkg -l myapp'時,它顯示爲仍然安裝。使用dpkg/apt-get更新軟件包也能順利運行。

我發現的是,如果您嘗試使用'dpkg -r myapp'刪除軟件包,dpkg會嘗試刪除/ tmp,這不是很好。不過/ tmp不容易刪除,所以它從來沒有成功。另外在我們的情況下,我們永遠不會刪除軟件包,而只需升級它

我最終不得不放棄通用程序包,因爲源代碼中的代碼差異導致不得不爲每個平臺重新編譯,但是我會以這種方式離開它,它確實有效。

我嘗試使用--instdir來更改軟件包的安裝目錄,但它確實重新定位了這些文件,但dpkg失敗,因爲無法找到與新​​instdir相關的dpkg文件。使用--instdir有點像chroot。我也嘗試過--admindir和 - 根據各種組合來查看是否可以使用dpkg系統相對於/但安裝重定位文件,但他們沒有工作。我想rpm有一個重定位選項,但不是Ubuntu。

0

您還可以編寫一個腳本,該腳本運行6次不同環境的dpkg-deb,生成6個不同的包。當您進行修改時,您只需運行腳本,即可生成所有6個軟件包,並且可以將它們安裝到您的機器上,避免後期黑客入侵!

0

爲什麼不安裝到標準位置,只需使用postinst腳本來創建到所需位置的符號鏈接?這更清潔,不應該破壞dpk -I中的任何內容。

相關問題