2015-04-19 62 views
4

我们有一个包含多个项目的解决方案,并且需要在编译完所有代码后在编译后的代码上运行一个工具。该工具必须以解决方案构建的所有.dll和.exe文件作为输入(因此,对于增量构建而言,只提供刚刚重建的二进制文件是不够的),并且所有这些二进制文件必须达到日期。MSBuild:从Visual Studio内部构建解决方案后运行目标程序

现在我们通过一个MSBuild.proj文件来执行此操作,该文件从命令行运行,该命令行包括所有项目,并使用MSBuild的Output元素查找解决方案中二进制文件的路径。

这有两个问题使得这个解决方案不太适合我们所需要的。该工具不需要实际运行在所有项目上,只有其中的一部分。我们需要从Visual Studio中构建。

看来我需要的是,在某些项目的.csproj文件中,定义一些说“在我身上运行工具”的东西,收集这些项目的路径,并在该路径集上运行该工具。

但我看不出如何做到这一点。它看起来像从Visual Studio构建时,我无法在项目构建之间共享状态,并且看起来在解决方案构建之后没有任何挂钩。

从命令行,之前有* .sln.targets和之后。* .sln.targets,但这些不能从Visual Studio中工作。

看起来好像我想要的是可笑简单,我只是想要一个工具自动查看构建后的解决方案的二进制文件,所以我不认为这应该是不可能的。但我无法从文档中看到如何做到这一点。我是MSBuild的新手,所以我可能错过了一些明显的东西。

+0

你可以加一个空项目的解决方案,在彼此添加项目的依赖,并在项目中添加定义生成后事件。 – Nikerboker

回答

1

Msbuild具有可扩展性目标。这些空目标可以在项目文件中使用。见following article and section Build process extensibility points

举例来说,如果你想要部署一些相关文件旁边的 装配一旦建成,覆盖AfterBuild目标将 要走的路,如下图所示。

我改变了他们的例子,使用exec任务如下。这个例子在你的二进制文件生成后使用YourCustomTasks.exe。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- Properties and items are deleted for clarity --> 
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <ItemGroup> 
     <Binaries Include="*.dll;*.exe"/> 
    </ItemGroup> 
    <Target Name="AfterBuild"> 
     <Exec Command="YourCustomTasks.exe %(Binaries.Identity)" /> 
    </Target> 
</Project> 

如果你想你的目标,以您的解决方案后的工作,用following answer

要执行的解决方案范围的之前和之后的目标,你会在同一文件夹中创建 两个命名“after..sln.targets” MSBuild项目文件和 “before..sln.targets”你 解决方案。

+0

但是,这将运行一次_each_项目建立,而不是_once_,_all_项目已建成后。 – GalaxyInvader

+0

@GalaxyInvader更新了我的答案。但似乎这在Visual Studio中不起作用。但是,您可以尝试其他解决方案级别的目标,以查看它们是否适合您。 –

+0

关于你的编辑:我在我的文章中特别提到过之前/之后。*。sln。目标不能在Visual Studio中工作,这也在你链接到的答案的评论中说明。 – GalaxyInvader

相关问题