我有一个库,其中包含如何使用该库以及单元测试的示例。
我正在尝试创建将在部署中的自定义VS2012解决方案。
根据启动部署时给出的输入,我希望能够创建解决方案 - 例如Samples.sln - 包括输入文件中指定的项目。
示例:
//inputfile1.txt
ProjectA
ProjectB
我运行MSBuild xml文件或F#脚本(或任何可以执行此操作的脚本),我得到一个包含ProjectA,ProjectA.Tests,ProjectB,ProjectB.Tests的Samples.sln的Samples目录
如果我用ProjectX&提供输入文件,会发生类似的事情。 Project7 ......等。
使用MSBuild,我已经弄清楚如何读取文件输入,将项目文件夹复制到新文件夹,并做一些我需要的整个过程,但我无法弄清楚如何创建和自定义一个办法。我不确定MSBuild是否可行 - 我想我只能改变现有的解决方案(但我也很难做到这一点)。
我想我有这些选择:
A. Add all projects to a Samples solution, then use msbuild to turn them on or off
or
B. There exists some other way (not using msbuild) to do this whole process
msbuild是否能够使用A?
答案 0 :(得分:1)
你应该明白,MsBuild主要是一个构建平台。它也恰好能够读写文件等,但这不是它的核心业务。因此,当你可以为它生成解决方案文件时,使用只是 MsBuild会很难,因为它根本不能直接做这样的事情。
这是一个选项C:如果你在文本编辑器中打开一个sln,你会发现结构非常简单:每个项目都有一个Project ... EndProject
。您可以在MsBuild目标中以适当的格式生成这些字符串(即genareate guid,找出解决方案的相对路径,从路径获取项目名称,...),将所有这些字符串放入ItemGroup然后将其写入a使用WriteLinesToFile的解决方案文件。完全可能,但很多工作,我不会推荐它。
对于您的选项A,这更难:从构建中包含/排除项目,VisualStudio使用.suo
文件,这些文件是一些二进制专有格式,我不知道如何生成。
这给你留下选项B,它基本上是选项C,但没有重新发明轮子:找到一个工具,可以为选定的项目生成解决方案文件,并让MsBuild使用Exec
调用它。可能有很多工具可以做到这一点,但这里有一个例子,使用我在互联网上找到的第一个可用的名为SolutionMaker的例子。假设您的项目位于Foo目录中,您可以像这样使用它:
<Exec Command="SolutionMaker /s Foo/foo.sln /p Foo /v 2012"/>
因为相应的命令行选项是
/s <solution>: Solution file path
/p <path>: project root path
/v <fileVersion>: New solution file will be generated in the specified format.
valid versions: 2008, 2010, 2012.