Msbuild 将后生成目标移动到.targets文件

Msbuild 将后生成目标移动到.targets文件,msbuild,Msbuild,我有一个后构建目标,我想用于解决方案中的多个项目。是否有一种方法可以将该目标放入.targets文件并在每个项目中引用该文件 下面是我尝试过的,但似乎不起作用 项目文件: <Import Project="..\debug.targets"/> .Targets文件: <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Tar

我有一个后构建目标,我想用于解决方案中的多个项目。是否有一种方法可以将该目标放入.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>

C:\Inetpub\wwwroot
$(网站目录)\$(根命名空间)

您所做的基本正确,但请确保您的导入语句是项目文件中的最后一次导入

要验证是否正确调用了目标,请从命令行以diag模式运行msbuild,并记录有关目标的输出

msbuild myproj.proj/v:diag

用这个

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

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

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


使用
$(MSBuildThisFileDirectory)
将强制相对路径使用预先确定的起始路径。您所需要做的就是填充相对路径的其余部分。

这在命令行中有效,但在从visual studio生成时不起作用。你知道visual studio有什么不同吗?@e82.eric-对。我真不敢相信我错过了。这是因为您的相对路径不正确。尝试将目标文件保留在项目文件夹中,或使用已知路径。从命令行启动时,路径解析正确,但对于VS,它从解决方案文件夹开始。我只是尝试将其更改为实际路径。在VS.@e82.eric-Hmmm中仍然无法工作。请尝试将visual studio的msbuild置于diag模式(工具->选项->项目和解决方案->构建和运行->msbuild oputput详细信息),然后查看它在构建窗口中的说明。仍然没有任何内容。如果我只键入msbuild,它实际上可以在命令提示符下工作。