【问题标题】:Linked file in WCF RIA service does not build in TFS Build serverWCF RIA 服务中的链接文件未在 TFS 构建服务器中构建
【发布时间】:2013-02-06 14:21:06
【问题描述】:

我刚刚设置了一个 TFS (2012) 服务器,现在我正在尝试通过 TFS Build 服务器构建完整的代码(在 VS 2010 中用 .NET 4.0 编写)。但在我的解决方案中,我还有一个 WCF RIA 项目,其中包含链接文件,因为它们也在其他地方使用,并且不可能在 WCF/Silverlight 中添加对通用 .NET 二进制文件的引用。

一切都在我的开发机器上构建没有任何问题,但是当我将它全部签入时,创建一个标准构建定义并运行该构建定义,我遇到了以下问题。链接文件有usings(例如UsingNamespace)到其他项目,这些项目也由我们构建并在WCF/Silverlight之前构建,但通过TFS构建服务器构建时弹出以下错误:

找不到类型或命名空间“UsingNamespace”(您是 缺少 using 指令或程序集引用?)'

我看过的这个问题有什么解决方案吗?

编辑 1

刚刚尝试将链接文件的Copy to Output Directory 属性设置为Copy Always,但这仍然给我带来了与我预期相同的错误。问题是链接文件放置在可以使用 usings 但 WCF RIA 服务无法访问/找到该使用的位置。

编辑 2

刚刚尝试了我的本地测试 TFS,我可以在其中做我想做的事,并在那里创建了一个构建定义,其中仅包含使带有链接文件的项目构建所需的解决方案。这没有任何问题。然后我在我们的 TFS 服务器上尝试了相同的方法,它使用了与我的测试 TFS 具有相同解决方案的新构建定义,但在这里它不起作用。我确定的唯一区别是我的测试 TFS 是 TFS 2012 Update 1,而我的生产 TFS 还没有更新 1。下周我会尝试安装它。

编辑 3

我刚刚将我们的生产 TFS 更新为更新 1,但它仍然无法使用我的临时构建定义,它仅包含使用链接文件构建 silverlight 应用程序所需的项目。两个服务器上的 2 个工作区相同,要构建的项目也相同。

【问题讨论】:

  • 什么是错误指向的 using 语句 - 您自己的命名空间或某些 .net 命名空间?
  • 它们指向我们自己的命名空间,构建输出将进入 UNC 路径。
  • 当你说其他项目也是由你构建的并且在 wcf/silverlight 构建之前 - 你怎么知道它们是之前构建的?
  • 我在引用由同一构建定义中的另一个解决方案构建的项目时也遇到了问题。我认为这是相同的结构,命名空间不是由该解决方案“构建”的。MSBuild 过程中的 csc 语句不包括那些用于引用的程序集,从而使您的解决方案无法构建。我们最终在每个解决方案中重建了所有程序集,这并不是我想要的情况,但它确实有效。
  • TFS 构建定义中包含的顺序不会影响项目的构建顺序。事实上,构建定义与构建几乎没有关系 - 它主要与获取有关文件、执行测试和一般 ALM 内容。构建定义指定要构建的解决方案和配置(位于进程选项卡上)。如果您的依赖项目不是作为该解决方案的一部分构建的,那么它们将不会被构建。最简单的做法是在您的主解决方案中包含相关项目。这有帮助吗?

标签: tfs wcf-ria-services tfsbuild using


【解决方案1】:

您需要在构建定义中指定要使用的构建的工作区信息。工作区是构建过程从源代码控制复制到构建服务器的内容。如果构建服务器的工作区中没有所有内容,则无法正确构建。

工作区选项卡中的源代码管理文件夹是您需要从 TFS 获得的文件的位置。构建代理文件夹是构建服务器预定义基本位置的相对路径。您通常会使用 $(SourceDir)\Folder 来指定构建过程所需的“文件夹”。

【讨论】:

  • 如果必要的文件不在一个根目录下的源代码控制中,您可以创建多个源位置并为构建代理文件夹命名。如果您想确定构建服务器在哪里寻找程序集 - 为 Process/ 2. Basic 下的 TFS 构建打开 Diagnostic Logging Verbosity
  • 我检查了构建服务器执行的MSBuild 命令,它不包含对程序集的任何引用(这可能是正常的,因为silverlight 应用程序无法引用普通的dll)。希望还有其他方法可以添加对这些程序集的引用,或者只是构建应用程序所需的另一个属性?
  • 关注周杰伦的插画!这是你的问题。你们都让这种方式变得比现在更难。 Tim 只需要正确定义他的工作文件夹。 Tim,如果您在构建定义中发布您的工作区映射的屏幕截图,那将非常有帮助!
【解决方案2】:

这听起来像是 $(Outdir) 问题。 TFS 中的构建定义会自动覆盖 Bin 文件夹。所有二进制文件在编译时都被重定向到 bin 文件夹。在我看来,您正在使用项目引用和文件引用的混合。文件引用可能是导致构建失败的原因。

如果您在同一构建中编译以下解决方案的示例

  • Solution1.sln(TFS 构建通行证)

    • project1.csproj
    • project2.csproj(参考项目1)
  • Solution2.sln(TFS 构建失败)

    • project3.csproj(引用项目 1 的二进制输出)

如果不自定义工作流程,TFS 开箱即用的期望是这个简单的构建会失败。原因是在您的开发框中,所有项目都将输出生成到一个目的地,而在 tfs 构建中,您的项目将构建到 $(Outdir)。

一些尝试

简单(我认为的最佳实践)

  Create 1 solution and use project references instead of file references.

复杂

  Build using MSBuild project files
  Modify your windows workflow to not override the $(Outdir)
  Copy the binaries after a build is complete.

自动化构建的最佳实践

  • 从命令行构建
  • 从 cmd 构建一个非 vs2010 命令行。
    • C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe FullpathtoSolutionFile.sln

干杯!

【讨论】:

  • 如果我可以让我的测试 TFS 充当我的生产 TFS,我将尝试创建 1 个解决方案,该解决方案涵盖了我需要让它工作的所有项目。
【解决方案3】:

显然 TFS 服务器上缺少 WCF RIA 服务 V1.0 SP2。如果安装了,问题就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多