2012-04-20 87 views
2

我有一個AfterBuild目標,我想用於解決方案中的多個項目。有沒有一種方法可以將該目標放入.targets文件並在每個項目中引用該文件。將構建目標移動到.targets文件後

下面是我試過的似乎沒有工作。

項目文件:

<Import Project="..\debug.targets"/> 

.Targets文件:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<Target Name="AfterBuild"> 
    <PropertyGroup> 
     <WebsiteDirectory>C:\Inetpub\wwwroot</WebsiteDirectory> 
    </PropertyGroup> 

    <ItemGroup> 
     <output Include=".\**\*.dll" Exclude=".\**\obj\**" /> 
     <output Include=".\**\*.pdb" Exclude=".\**\obj\**" /> 
     <output Include=".\**\*.svc" /> 
     <output Include=".\**\*.xap" /> 
     <output Include=".\**\*.aspx" /> 
     <output Include=".\**\*.js" /> 
     <output Include=".\**\*.config" /> 
    </ItemGroup> 

    <PropertyGroup> 
     <VirtualDirectoryPath>$(WebsiteDirectory)\$(RootNamespace)</VirtualDirectoryPath> 
    </PropertyGroup> 

    <copy SourceFiles="@(output)" DestinationFiles="@(output->'$(VirtualDirectoryPath)\%(RecursiveDir)%(Filename)%(Extension)')" /> 
</Target> 

回答

4

使用此

<Import Project="$(MSBuildThisFileDirectory)\debug.targets"/> 

$(MSBuildThisFile) =目前的項目文件。
$(MSBuildThisFileDirectory) =包含當前項目文件的目錄。

項目文件中的相對路徑很難使用,具體取決於調用項目文件的內容。直接使用msbuild,相對路徑將解析爲項目文件。使用VS,相對路徑將使用解決方案文件作爲基礎路徑。使用$(MSBuildThisFileDirectory)將強制相對路徑使用預定的開始路徑。您只需填寫相對路徑的其餘部分即可。

+0

謝謝,我放棄了這一點,但工作。 – 2012-07-29 08:57:50

1

你在做什麼是從根本上是正確的,但要確保你的import語句是該項目的最後一個導入文件。

要驗證目標是否正確調用,請在命令行中以診斷模式運行msbuild,並記下有關目標的輸出。

的MSBuild myproj.proj/V:診斷

+0

從命令行工作,但從Visual Studio生成時無法工作。任何想法什麼視覺工作室在做什麼不同? – 2012-04-20 03:59:31

+0

@ e82.eric - 對。我不能相信我錯過了這一點。因爲你的相對路徑不正確。嘗試將目標文件保留在項目文件夾中,或使用已知的路徑。從命令行啓動時,路徑正確解析,但對於VS,則從解決方案文件夾啓動。 – 2012-04-20 04:00:48

+0

我只是試圖改變它到實際的路徑。 並且仍然無法從VS. – 2012-04-20 04:05:38