【问题标题】:How do I build a VSTS project with an absolute-path reference folder?如何使用绝对路径引用文件夹构建 VSTS 项目?
【发布时间】:2018-06-30 05:07:47
【问题描述】:

我在 TFS 中有两个项目,WebSiteReference,它们遵循以下结构:

$\

  • 网站:待建的主要项目

  • 参考:包含许多可参考 dll 的存储库。

Website.dll 使用存在于Reference 的 dll,但由于多种原因,它们不包含在同一个解决方案中,并且可能映射到不遵循 VSTS 结构的不同文件夹。

因此,为了使网站项目在本地编译,Website.csproj 处的Reference's.dlls Hintpath 已手动更改为所有开发人员计算机通用的特定绝对路径。

现在,我们正在体验 CI/CD,我们对让 VSTS 完成构建/部署的肮脏、乏味工作的假设感到兴奋。问题是,由于 Reference.dll 与 Website 不在同一个项目中,构建最终会缺少必要的库(前面提到的 Reference 文件夹)并且失败。

有没有办法将 VSTS 告诉 GET Reference 的 dll(此时已编译),将它们复制到正在构建的目录 Website.csproj 并让它们用于构建主项目?

我尝试过的:

第一:

  • Get Sources 步骤中映射网站和参考
  • 使用Copy Files 任务,将Source FOlder 设置为$\References 并将目标文件夹设置为$(Agent.BuildDirectory)
  • 构建

现在:

  • 在主项目中添加了所有引用。

在这两种情况下,都找不到任何引用,并且

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

抛出错误。

我一直在搜索 vsts 帮助部分,但似乎找不到任何明显的解决方案。

非常感谢任何帮助。

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

    主要是源代码管理(TFVC repo)中没有添加Reference的dll

    首先,请确保将参考的 dll 添加到网站项目中。所以项目文件将包含如下引用(ClassLibrary1.dll 作为下面示例中的引用):

    <Reference Include="ClassLibrary1">
      <HintPath>..\..\ClassLibrary1\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll</HintPath>
    </Reference>
    

    然后您可以使用以下任何选项来使引用的 dll 工作。

    选项 1:将引用的 dll 添加到源代码管理中

    如果您已将 .tfignore 文件添加到 TFVC 存储库中,它将忽略 **\bin, 下的文件和文件夹,因此默认情况下引用 dll 不会签入到 TFVC 存储库。您可以按照以下选项将参考 dll 签入到 TFVC 存储库中:

    1. 排除.tfignore中的引用dll

      排除您要在.tfignore 中引用的dll。格式为:

      !**\referencename.dll
      

      !**\ClassLibrary1.dll

    2. 将引用 dll 添加到源代码管理中

      在 VS -> 源代码管理资源管理器 -> 将项目添加到文件夹 -> 选择 dll。

    3. 签入并仔细检查 dll 是否已添加到 TFVC 存储库中

      在 VS 挂起更改窗口中,将显示 dll 和 .tfignore 文件作为 Inculded 更改,检查更改。

      并仔细检查 dll 是否已添加到 VSTS 网页的 TFVC 存储库中。

    选项2:在建站项目前先建参考项目

    如果您不想将dll添加到源代码管理中,您也可以先构建参考解决方案,以便在构建网站项目之前生成参考dll。详情如下:

    编辑构建定义 -> 在构建网站项目之前添加 VS 构建任务(指定参考解决方案) -> 保存并排队构建。

    注意:对于选项2,您在相对路径中指定的构建配置应与VSTS构建定义中的构建配置一致。

    比如我在相对路径..\..\ClassLibrary1\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll中指定了Debug。所以在我的VSTS构建定义中,VS构建任务构建参考项目,构建配置必须是Debug

    现在,无论您使用哪个选项,VSTS 构建都不会显示错误消息The type or namespace name '(namespacehere)' could not be found

    【讨论】:

    • 感谢@Marina 的广泛回答。如果我决定选择第二个选项,两个项目会在同一个输出文件夹中生成二进制文件吗?还是我必须执行复制任务才能将文件从一个路径移动到另一个路径?
    • @EricWu 二进制文件将分别在每个项目的bin 文件夹下生成。没有必要使用 Copy files tass,因为它已经定义为在参考项目下搜索 dll(在我的示例中为路径 ..\..\ClassLibrary1\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll)。提醒一下:您应该在获取源步骤中映射所有项目,因此只需将本地路径留空(ibb.co/hSe3md),vsts build 会将所有文件从 TFVC 存储库获取到 $(build.sourcesDirectory)
    • 在这种情况下,两个项目必须存在于同一个解决方案中,对吧?在我的场景中,这些项目属于不同的解决方案。不加入他们还有可能吗?
    • 并非所有项目都位于同一解决方案中。项目属于不同的解决方案可以吗?你又建了,结果如何?
    • 我基本上是使用第一种方法构建的,它适用于所有目的(因此,我将您的答案标记为 the 答案)。不过,我对第二种方法很好奇。如果项目不在同一个解决方案中,是否意味着它们必须通过文件系统路径进行引用?
    【解决方案2】:

    解决此问题的正确方法是不在源代码管理中存储引用。将它们转换为包,将它们存储在包管理提要中,并在构建期间恢复它们。开发者会在构建时自动恢复它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 2014-09-11
      • 2013-03-31
      • 1970-01-01
      • 2018-09-27
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多