我有一个包含许多项目的大型解决方案,其中一个是安装项目。还有许多当前版本存储在单独的分支中。我有一个曾经在.NET 2中工作的构建工具,但自从我们升级到.NET 4以后就没有用。
在内部,构建工具的新.NET 4版本使用Microsoft.TeamFoundation.Client.RegisteredTfsConnections.GetProjectCollections()
和versionControlServer.GetAllTeamProjects(false)
从我的TFS源代码管理服务器获取TeamProject
的集合。
然后我在UI中直观地显示它们,当用户点击特定解决方案版本时,应用程序会调用以下内容来获取该解决方案版本的最新信息:
workspace.Get(new string[] { serverPath }, VersionSpec.Latest, RecursionType.Full,
GetOptions.GetAll);
用于构建解决方案文件的应用程序,这将包括安装项目。在此阶段,安装项目将创建可以安装应用程序的MSI。这是我遇到问题的最后一步。
我需要能够以编程方式构建用户使用C#代码选择的解决方案。工作的.NET 2代码如下:
Process process = new Process();
ProcessStartInfo processStartInfo = process.StartInfo;
processStartInfo.FileName = processName;
processStartInfo.Arguments = string.Format(" \"{0}\" /BUILD \"Release|Any CPU\"",
solutionPath);
processStartInfo.WorkingDirectory = processDirectory;
process.Start();
运行它时没有错误,但它不再启动Visual Studio并构建代码。显然,这是一个很难做到最初的方法,但我找不到使用TFS类的“正确”方法。
我也尝试直接运行MSBuild.exe(类似于上面的例子),这确实构建了解决方案,但由于某种原因没有构建生成MSI的安装项目。请注意,我不使用任何手动创建的构建文件。
不幸的是,很难找到Microsoft.TeamFoundation命名空间的有用文档!我希望这里有人利用这些课程,并指导我解决这个问题。
如果可能的话,我需要使用.NET类(例如不是Process.Start),因为我真的需要知道构建何时完成。但是,如果这个问题太多,我可以为此设置一个FileSystemWatcher
对象。
答案 0 :(得分:5)
msbuild会跳过安装程序项目,因为它不知道如何构建它们。 FinalBuilder发送到devenv.exe来构建这些。
调用`devenv / build'发布|任何CPU“/项目”MyInstaller.vdproj“都应该从命令行运行你需要的构建,而无需启动VS GUI。试试吧!
尽管如此:我们也使用FinalBuilder,并且不推荐使用VS Installer,因此您可能希望计划更换它。
答案 1 :(得分:2)
事实证明,问题完全不相关。要更新的.NET 2代码将硬编码的“Program Files”编码到devenv.exe文件路径中 - 但新计算机为64位,Visual Studio 2010安装在“Program Files(x86)”中!
所以这意味着上面的代码示例可以工作,并允许我从C#构建解决方案。这不是面向对象的方式,我宁愿这样做,但是在你所有的评论之后,我很高兴能够让它发挥作用。
感谢大家的时间。