2016-08-16 84 views
1

我有幾個.csproj文件,我將導入一個常見的.targets文件,以擴展構建過程。這些項目位於不同的目錄中。 .targets文件位於解決方案目錄中。我如何引用.targets文件的位置來導入它?有一個解決方案目錄屬性,但如果開發人員只是構建一個項目,這不起作用。我該怎麼辦?我正在使用.NET 4.5和Visual Studio 2015.MSBuild共享.targets文件

回答

2

正如你所想的那樣,一個項目並不知道它所包含的解決方案,而且可以說它不應該。所以,從項目的角度來看,從程序的角度來看,你可以做的事情很少,從一個完全不相關的文件所在的位置開始。除了掃描整個文件系統。有一些替代方案:

  • 依賴於正確的目錄結構。無論如何,您已經這樣做了,因爲您使用的解決方案也需要在固定位置查找項目。所以假設你有一個主項目目錄與projectA/a.vcxproj,projectB/b.vcxproj和solutionDir/ab.sln和solutionDir/my.targets然後在a和b中只需<Import Project="$(MSBuildProjectDirectory)..\solutionDir\my.targets"/>
  • 需要一個屬性(或環境變量)它被設置爲目標文件的位置,然後使用<Import Project="$(SomeDir)\my.targets"/>
  • 將您的目標文件放入「已知」msbuild位置,例如Importbefore/ImportAfter目錄,例如here

我使用所有這些在一個點,並最終第一個在我看來是最好的一個:你必須要堅持一個目錄約定 - 你需要說,無論如何,跨越多重的項目目錄或共同的東西 - 就是這樣。例如,我們有很多常見的msbuild文件,它們都在一個存儲庫中。開始一個新項目總是歸結爲創建一個目錄,克隆通用文件目錄並添加一個新的項目目錄。這可以輕鬆實現自動化,在典型的CI服務器上也可以很好地工作。第二種選擇也是可行的,但它依賴於一個適當的設置環境,它不太「自包含」,如果開發人員開始在機器的全局環境變量設置和本地環境變量設置中輸入變量,則會變得非常混亂上。第三個類似的問題,但現在只有一個正確的位置更糟。

+0

我正在一個大型項目中工作,所以我無法控制目錄結構。不幸的是1不會爲我工作。所有這些文件都被檢入到源代碼控制中,並且開發人員可以將文件放在他們喜歡的驅動器上的任何位置,所以3也不起作用。我會等着看是否有更多的答案進來,因爲我來這裏試圖避免2,但這可能是我走的方向。 –

+0

我錯過了什麼,爲什麼不工作?您將目標文件放在解決方案目錄中。該解決方案使用相對路徑來查找項目,以便項目具有到解決方案的固定相對路徑,因此也具有目標文件。你有不是解決方案的一部分的項目嗎? – stijn

+0

項目在目錄結構中處於不同的級別。有些是兩層深的,有三層......我想我可以在.sln文件上做現有條件來確定我在哪個深度。 –