17

有没有人分享尝试使用 Visual Studio 为 Unix 开发应用程序的战斗故事?而且我不是在谈论使用.NET 和下面运行的 Mono 或 Wine 虚拟平台。

我们公司有大约 20 名开发人员,他们都运行 Windows XP/Vista,主要针对 Linux 和 Solaris 进行开发。直到最近,我们都登录到一个主要的 Linux 服务器并以老式的方式修改/构建代码:Emacs、Vi、dtpad - 任你选择。然后有人说,“嘿 - 我们生活在黑暗时代,我们应该使用 IDE”。

所以我们尝试了一些,并确定 Visual Studio 是唯一能满足我们性能需求的(是的,我确信 IDE X 是一个非常好的 IDE,但我们选择了 VS)。

问题是,您如何设置环境以使文件在本地可用于 VS,但也可用于构建服务器?我们决定编写一个 Visual Studio 插件——它会在我们点击“保存”时将我们的文件写入本地和构建服务器,并且我们有一个有点胖的“同步”按钮,当我们的文件在服务器端发生更改时我们可以按下它(当我们从源代码控制服务器更新到最新文件)。

该插件还使用 Visual Studio 的外部构建系统功能,最终只需 ssh 进入构建服务器并调用我们的本地“make”实用程序(即 Boost Build v2 - 具有很好的依赖性检查,但结果是启动速度非常慢,即 30- 60 秒开始)。结果通过管道传回 Visual Studio,因此开发人员可以单击错误并转到相应的代码行(实际上非​​常巧妙)。构建服务器使用 GCC 并交叉编译我们所有的 Solaris 构建。

但即使我们已经完成了这一切,每当我开始在 Visual Studio 中编写代码时,我都会忍不住感叹。我单击一个文件,开始打字,然后 VS 突突地赶上我。

还有什么比不得不停下来等待工具更烦人的事情吗?好处值得沮丧吗?

想法、故事、帮助?

4

13 回答 13

7

VS突突追上我。
嗯......你的机器需要更多的内存和咕噜声。我的从来没有性能问题。

我有大约十年的经验,完全按照您的建议去做,其中大部分是在金融行业,为银行、证券交易所、股票经纪领域的客户开发实时系统。

在继续之前,我需要承认所有这些都是在 VS6 + CVS 以及最近的 SVN 中完成的。

源代码版本控制

开发人员拥有单独的 sourcesafe 存储库,以便他们可以存储他们的工作并在逻辑里程碑检查它的工作包。当他们觉得想要进行集成测试时,我们会运行一个脚本,将其签入 SVN。

一旦签入 SVN,我们就会启动一个流程,该流程将自动生成相关的 makefile 以在目标机器上编译它们以进行持续集成。

我们还有另一组脚本,可以将 SVN 中的新内容同步到 VS 管理的文件夹。有一点差距,因为 VS 不能自动拾取新文件;我们通常手动处理。这只会在项目的前几天经常发生。

这是我们如何维护代码的概述。我不得不说,我可能已经掩盖了一些细节(如果你感兴趣,请告诉我)。

编码

从编码方面来看,我们严重依赖makefile 中的预处理器(即#define 等)和标志来塑造编译过程。对于跨平台可移植性,我们使用 GCC。有几次,我们被迫在 HP-UX 和其他一些编译器上使用 aCC,但我们并没有太多的悲伤。唯一一直很痛苦的事情是,我们必须注意跨平台的线程堆空间。编译器并没有让我们摆脱这一点。

为什么?

问题通常是,“你为什么要拥有如此复杂的开发方式?”。我们的回答通常是另一个问题,“你知道通过检查核心转储或使用 gdb 来调试多线程应用程序有多疯狂吗?”。基本上,当您在调试一个晦涩的错误时,我们可以跟踪/单步执行每一行代码,这一切都值得付出努力!

另外!... VS 的智能感知功能使查找属于类的方法/属性变得如此容易。我还听说VS2008有重构功能。我已经将我的注意力转移到具有这两个特性的 Eclipse 上的 Java。你会更有效率地专注于编码业务逻辑,而不是花精力让你的大脑做一些事情,比如记住

还!...我们最终会得到一个可以在 Windows 和 Linux 上运行的产品!

祝你好运!

于 2008-10-17T06:49:44.970 回答
3

我感觉到你的痛苦。我们有一个“跨平台”的应用程序。一个典型的客户端/服务器应用程序,客户端需要能够在 Windows 和 linux 上运行。由于我们的客户群主要使用 Windows,我们使用 VS2008(调试器让生活变得更轻松) - 但是我们仍然需要执行 linux 构建。

这样做的主要问题是我们正在检查我们不知道会在 gcc 下构建的代码,这很可能会破坏我们设置的 CI 内容。因此,我们在所有开发人员的机器上安装了MingGW,这允许我们在将其提交回存储库之前测试该工作副本将在 gcc 下构建。

于 2008-08-19T03:58:22.873 回答
2

我们为 Mac 和 PC 开发。我们只是在我们喜欢的任何 ide 中本地工作,主要是 VS,也包括 xcode。当我们觉得我们的更改对于构建服务器来说足够稳定时,我们会将它们签入。两个构建服务器(Mac 和 PC)寻找源代码控制签入,并且每个都进行构建。构建错误会通过电子邮件发送回团队。

在构建服务器上实时编辑文件对我来说听起来很不稳定。如果您请求构建​​,而另一个开发人员进行了无法构建的编辑,会发生什么情况?

于 2008-10-17T07:57:46.050 回答
2

我知道这并不能真正回答您的问题,但您可能需要考虑设置远程 X 会话,然后运行类似KDevelop之类的东西,顺便说一下,它是一个非常好的 IDE——甚至是Eclipse,它更主流,并拥有更广泛的开发者基础。您可能只使用Xming之类的东西作为 Windows 机器上的 X 服务器。

于 2008-11-10T19:51:38.773 回答
1

@monjardin

我们使用它的主要原因是因为通过 Visual Assist X(由 Whole Tomato 提供)提供的重构/搜索工具。尽管还有许多其他不错的功能,例如 Intelli-sense。我们还在研究与我们的其他工具 AccuRev、Bugzilla 和 Totalview 的集成,以完善该环境。

@roo

使用多个编译器听起来很痛苦。我们有幸在所有平台上坚持使用 gcc。

@乔希

哎呀!这听起来像是引入错误的好方法!:-)

于 2008-08-19T14:10:22.513 回答
1

哇,这听起来像是 Visual Studio 的一个非常奇怪的用途。我很高兴在 vim 中大快朵颐。然而,我喜欢 Visual Studio 的一件事是调试器。听起来你甚至没有使用它。

当我打开这个问题时,我认为您一定是指在 Visual Studio 中开发可移植应用程序,然后将它们迁移到 Solaris。我已经做到了这一点,并有愉快的经历。

于 2008-08-19T03:24:23.677 回答
1

网络共享。

当然,您在网络上有致命的延迟,但至少您的文件只有一个副本。

你不想听到我在两个平台上开发时做了什么。但是您将:每天拖放几次副本。本地构建和运行,并定期在 Unix 上检查它以确保 gcc 满意并且单元测试在该平台上也很满意。那里并不是一个快速的周转周期。

于 2008-08-19T04:20:08.370 回答
1

我在cygwin中使用 gcc 在 Visual Studio 中开发 Playstation2 代码有很好的经验。如果您有带有 gcc 和 glibc 的 cygwin,它应该与您的目标环境几乎相同。您必须能够跨 Solaris 和 Linux 移植这一事实暗示 cygwin 应该可以正常工作。

于 2008-11-10T20:02:04.103 回答
1

我的大部分编程经验都是在 Windows 中进行的,而且我是 Visual Studio 的忠实粉丝(尤其是使用 Resharper,如果你碰巧在做 C# 编码的话)。这些天我一直在用 C++ 为 linux 编写一个应用程序。在尝试了所有的 IDE(Netbeans、KDevelop、Eclipse CDT 等)之后,我发现 Netbeans 是最不糟糕的。对我来说,绝对最低要求是我能够单步执行代码并且我有智能感知,理想情况下还有一些重构功能。令我惊讶的是,今天的 linux IDE 与十多年前的 Visual Studio 6 相差甚远。目前最大的痛点是 Netbeans 中的智能感知执行速度有多慢且执行不力。在具有 8GB RAM 的快速机器上填充需要 2-3 秒。Eclipse CDT 的智能感知更加滞后。对不起,

所以现在我正在考虑在 Windows 中使用 VS,即使我唯一的构建目标是 linux ......

克里斯,你可能想看看免费的自动化构建服务器“CruiseControl”,它与所有主要的源代码控制系统(svn、tfs、sourcesafe 等)集成。它的全部目的是对源代码控制系统中的签入做出反应。通常,您对其进行配置,以便任何人签入代码时,都会启动构建并(理想情况下)运行单元测试。对于某些语言,有一些很棒的插件可以进行代码分析、测量单元测试代码覆盖率等。有关成功/失败构建的通知会发送回团队。这是一篇描述如何为 C++ 设置它的帖子:link (thoughtworks.org)

我刚刚开始从仅 linux 的简单配置(Netbeans + SVN,没有构建自动化)转换为使用带有构建自动化后端的 Windows VS 2008,除了在 linux 中进行构建之外,它还运行单元测试。我对完成所有配置所需的时间感到不寒而栗,但我想越快越好。

在我理想的最终状态下,我将能够从 VS 项目中自动生成 Netbeans 项目文件,这样当我需要在 linux 中调试某些东西时,我可以从那个 IDE 中进行。VS 项目文件是基于 XML 的,所以应该不会太难。

如果有人对此有任何指示,我将不胜感激。

谢谢,

克里斯托夫

于 2009-04-01T18:03:34.503 回答
1

您可以让开发人员在私人分支机构工作(如果您使用 DVCS 会更容易)。然后,当您想要签入某些代码时,您可以将其签入 [windows|unix] 上的私有分支,更新 [unix|windows] 上的沙箱并构建/测试,然后再提交回主分支。

于 2009-08-31T21:44:39.423 回答
0

我们正在使用与您描述的类似的解决方案。

我们将代码存储在世界的 Windows 端,而 UNIX(确切地说是 QNX 4.25)可以通过 NFS 挂载访问(感谢 Windows 的 UNIX 服务)。我们有一个进入 UNIX 的 ssh 来运行 make 和输出到 VS 的管道。访问代码很快,构建比以前慢了一点,但我们最长的编译目前不到两分钟,没什么大不了的。

为 UNIX 开发使用 VS 值得付出努力,因为我们现在有了 IntelliSense。少打字=快乐的开发者。

于 2008-08-19T04:08:02.667 回答
0

查看“最终生成器”(http://www.finalbuilder.com/)。选择一个版本控制系统(例如 cvs 或 svn,老实说,cvs 听起来更适合这个特定的用例),然后在 FinalBuilder 上设置构建触发器,以便签入导致编译并将结果发送回给你.

您可以在 FinalBuilder 中设置规则集,以防止您将损坏的代码签入/合并到基线或某些分支文件夹中,但允许其他人使用(我们不允许损坏的提交到 /baseline 或 /branches/*,但我们有 / wip/ 分支文件夹,供需要共享可能损坏的代码或只想在一天结束时提交的开发人员使用)。

您可以将 FB 分布在多个“构建服务器”上,这样您就不会遇到 20 个人试图在一个盒子上构建,或者等待一个盒子来处理所有的小提交。

我们的项目有一个基于 Linux 的服务器,带有 Mac 和 Win 客户端,它们都共享一个共同的代码库。这种设置对我们来说非常有效。

于 2010-01-24T01:43:45.750 回答
0

我在工作中也在做同样的事情。我使用的设置是用于 Windows 开发的 VS,在 VirtualBox 下运行 Linux VM 用于本地构建/执行验证。VirtualBox 有一个工具,您可以在其中使主机操作系统(在我的情况下为 Windows 7)上的文件夹可用作来宾中的可挂载文件系统(在我的情况下为 Ubuntu LTS 12.04)。这样,在我开始 VS 构建并保存文件后,我可以立即在 Linux 下启动 make 以验证它在那里构建和运行正常。

我们使用 SVN 进行源代码控制,最终目标是一台 Linux 机器(它是一个游戏服务器),所以它使用与我本地 Linux 构建相同的 makefile。这样,如果我将文件添加到项目/更改编译器选项,通常添加/更改 -D,我最初在 VS 下进行修改,然后立即更改 Linus makefile 以反映相同的更改。然后,当我提交时,构建系统(Bamboo)会接受更改,并进行自己的验证构建。

来之不易的经验表明,如果您从一开始就这样构建,这将容易一个数量级。

我从事的第一个项目仅从 Windows 开始,我被聘请将其移植到 Linux,因为他们想切换到同质的服务器环境,而其他一切都是 Linux。将 Windows 项目改造成这种设置是一项相当大的努力。

第二个项目从第一天开始就完成了“两个系统构建”。我们希望保持使用 VS 进行开发/调试的能力,因为它是一个非常完善的 IDE,但我们也需要最终部署到 Linux 服务器。正如我在上面提到的,当项目从一开始就考虑到这一点时,它是非常轻松的。最糟糕的部分是一个文件:system_os.cpp,其中包含特定于操作系统的例程,例如“获取自 linux 纪元开始以来的当前时间,以毫秒为单位”等等等等。

冒着跑题的风险,我们还为此创建了单元测试,并且对操作系统特定的部分进行单元测试提供了极大的信心,即它们在两个平台上的工作方式相同。

于 2014-09-14T04:29:36.033 回答