Azure devops 如何使用绝对路径引用文件夹构建VSTS项目?

Azure devops 如何使用绝对路径引用文件夹构建VSTS项目?,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,我在TFS中有两个项目,网站和参考,它们遵循以下结构: $\ 网站:主要建设项目 参考:包含许多可参考DLL的存储库 Website.dll使用Reference中现有的dll,但由于多种原因,它们不包含在同一解决方案中,并且可能映射到不遵循VSTS结构的不同文件夹 因此,为了让网站项目在本地编译,已手动将网站.csproj上的参考的.dllsHintpath更改为所有开发人员机器通用的特定绝对路径 现在,我们正在体验CI/CD,并且我们对让VST进行构建/部署这项肮脏而乏味的工作的假设

我在TFS中有两个项目,
网站
参考
,它们遵循以下结构:

$\

  • 网站:主要建设项目

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

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

因此,为了让网站项目在本地编译,已手动将
网站.csproj
上的
参考
的.dlls
Hintpath
更改为所有开发人员机器通用的特定绝对路径

现在,我们正在体验CI/CD,并且我们对让VST进行构建/部署这项肮脏而乏味的工作的假设感到兴奋。问题是,由于Reference.dll和网站不在同一个项目中,所以构建最终缺少必要的库(前面提到的参考文件夹)并失败

有没有办法告诉VST获取
参考
的DLL(此时编译),将它们复制到目录
网站。csproj
正在构建中,让它们用于构建主项目

我所尝试的:

第一:

  • Get Sources
    步骤中映射网站和参考
  • 使用
    复制文件
    任务,将
    源文件夹
    设置为$\References,将目标文件夹设置为$(Agent.BuildDirectory)
  • 建造
现在:

  • 在主项目中添加了所有引用
在这两种情况下,都找不到任何引用,并且

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

抛出错误

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


非常感谢您的帮助。

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

这主要是由于引用的DLL没有添加到源代码管理(TFVC repo)

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

比如
**\ClassLibrary1.dll

  • 将引用DLL添加到源代码管理中

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

  • 签入和双重检查DLL已添加到TFVC repo中

    在VS pending changes窗口中,将显示DLL和
    .tfignore
    文件作为包含的更改,签入更改

    并再次检查DLL是否添加到VSTS网页中的TFVC repo中

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

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

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

    例如,我在相对路径
    中指定了
    Debug
    。\..\ClassLibrary1\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll
    。因此,在我的VSTS构建定义VS build task中,要构建参考项目,构建配置必须是
    Debug


    现在,无论您使用哪个选项,VSTS build都不会显示错误消息。
    找不到类型或命名空间名称“(namespacehere)”

    谢谢您的详细回答,@Marina。如果我决定使用第二个选项,两个项目是否会在同一个输出文件夹中生成二进制文件?或者我必须执行复制任务才能将文件从一个路径移动到另一个路径吗?@EricWu二进制文件将分别在每个项目的
    bin
    文件夹下生成。没有必要使用复制文件tass,因为已经定义了它来搜索引用项目下的dll(在我的示例中是路径
    。\..\ClassLibrary1\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll
    )。提醒一下:您应该在Get sources步骤中映射所有项目,所以只需将本地路径留空(),vsts build将把所有文件从TFVC repo获取到
    $(build.sourcesDirectory)
    。在这种情况下,两个项目必须存在于同一个解决方案中,对吗?在我的场景中,这些项目属于不同的解决方案。不加入它们仍然可能吗?并非所有项目都位于同一个解决方案中。项目属于不同的解决方案可以吗?你有没有重新构建,结果如何?我基本上是使用第一种方法构建的,它适用于所有目的(因此我将你的答案标记为答案)。不过,我还是对第二种方法感到好奇。如果项目不在同一个解决方案中,是否意味着它们必须通过文件系统路径进行引用?
    <Reference Include="ClassLibrary1">
      <HintPath>..\..\ClassLibrary1\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll</HintPath>
    </Reference>
    
    !**\referencename.dll