将AfterBuild目标移动到.targets文件中

4
我有一个AfterBuild目标,我想在解决方案中的多个项目中使用它。 有没有办法将该目标放入.targets文件中,并在每个项目中引用该文件。
以下是我尝试过的,但似乎不起作用。
项目文件:
<Import Project="..\debug.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>

2个回答

4
请使用以下内容。
<Import Project="$(MSBuildThisFileDirectory)\debug.targets"/> 

$(MSBuildThisFile) = 当前项目文件。
$(MSBuildThisFileDirectory) = 包含当前项目文件的目录。

在项目文件中使用相对路径可能难以使用,这取决于调用项目文件的方式。直接使用msbuild和相对路径将解析为项目文件。使用VS和相对路径将使用解决方案文件作为基本路径。

使用$(MSBuildThisFileDirectory)将强制相对路径使用预定的起始路径。您只需要填写其余的相对路径即可。


1

你所做的基本上是正确的,但请确保你的 Import 语句是项目文件中最后一个 Import。

为了验证目标是否被正确调用,请从命令行以 diag 模式运行 msbuild,并注意有关你的目标的输出。

msbuild myproj.proj /v:diag


这个命令行可以工作,但是在Visual Studio中构建时无法工作。你有什么想法,为什么会有这种不同的情况? - e82.eric
@e82.eric - 嗯...尝试将Visual Studio的msbuild设置为diag模式(工具->选项->项目和解决方案->生成和运行->MSBuild输出详细程度),并查看构建窗口中的输出信息。 - Ritch Melton
@e82.eric - 你能把Visual Studio的诊断日志放在某个地方吗? - Ritch Melton
@e82.eric - 正在运行:目标“AfterBuild: (TargetId:65)”位于文件“C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets”中,来自项目“C:\prompts_all\trunk\src\Prompts.Web\Prompts.Web.csproj”(目标“Build”依赖于它): 已完成在项目“Prompts.Web.csproj”中构建目标“AfterBuild”:(TargetId:65) - Ritch Melton
当我查看来自msbuild的日志时,它显示正确覆盖。在项目“C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets”中覆盖目标“AfterBuild”与来自项目“C:\prompts_all\trunk\src\debug.targets”的目标“AfterBuild”。http://code.google.com/p/prompts/downloads/detail?name=msbuild_afterbuild.txt&can=2&q= - e82.eric
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接