2

我有两个模块可以很好地构建和部署。但是他们都有共享代码,我想将它们拉到一个单独的“共享”项目中。这些模块引用了共享项目,一切似乎都正常。

但是当我想构建 docker 映像时,我得到了这个跟踪:

PROCESSING DOCKER FILE: ./Dockerfile
    PUBLISHING MODULE: modules/Valid.PrivacyCrawler.Crawlers
    Microsoft (R) Build Engine version 15.5.179.9764 for .NET Core
    Copyright (C) Microsoft Corporation. All rights reserved.
    BUILDING DOCKER IMAGE: privacycrawler.azurecr.io/valid.privacycrawler.crawlers:0.0.12-amd64
    Traceback (most recent call last):
      File "/usr/local/bin/iotedgedev", line 11, in <module>
        sys.exit(main())
      File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 722, in __call__
        return self.main(*args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 697, in main
        rv = self.invoke(ctx)
      File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 1066, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 895, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 535, in invoke
        return callback(*args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/click/decorators.py", line 17, in new_func
        return f(get_current_context(), *args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/iotedgedev/cli.py", line 132, in push
        ctx.invoke(modules, push=push, deploy=deploy, no_build=no_build)
      File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 535, in invoke
        return callback(*args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/iotedgedev/cli.py", line 454, in modules
        mod.push(no_build=no_build)
      File "/usr/local/lib/python2.7/dist-packages/iotedgedev/modules.py", line 22, in push
        self.build_push(no_build=no_build)
      File "/usr/local/lib/python2.7/dist-packages/iotedgedev/modules.py", line 77, in build_push
        build_result = self.dock.docker_client.images.build(tag=image_destination_name, path=".", dockerfile=docker_file_name, buildargs={"EXE_DIR": mod_proc.exe_dir})
      File "/usr/local/lib/python2.7/dist-packages/docker/models/images.py", line 183, in build
        raise BuildError(chunk['error'], result_stream)
    docker.errors.BuildError: The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1

当我复制代码并且不使用共享项目时,它只会毫无问题地构建模块。

是否有一个共享项目,就像模块一样是 .NET 核心,不受支持?

我可以毫无问题地使用 NuGet 包(如 Newtonsoft.JSON)。

4

3 回答 3

0

是的,据我所知,它不支持边缘模块的共享项目。但是您可以创建一个库项目,构建项目,然后将 dll 作为对模块项目的引用添加。它可以解决。您可以在此处针对此要求 发布反馈。在此处输入图像描述

于 2018-07-26T08:01:12.433 回答
0

我们实际上设法使用了一个共享项目,但棘手的是修改您的 Dockerfile 以包含所有引用的项目。这必须手动完成。您必须在 Dockerfile 中添加与此类似的一行:

COPY ReferencedProjectFolder/ReferencedProject.csproj ReferencedProjectFolder/

但是,您不能使用 VS Build,因为它传递的上下文仅限于正在构建的模块的文件夹。您必须编写自己的docker build命令并通过 Powershell 构建模块。该命令可以从 VS Build 输出中复制。但是build命令的上下文参数也应该更改为使用父目录。一个例子:

cd <module_folder>
docker build --rm -f $dockerfileName -t $imageNameTagged $buildContext

$buildContext应该是模块及其所有引用项目都是子文件夹的父目录的路径,否则上述命令COPY将失败,因为它没有“看到”引用的项目文件夹。

通过这种方式,我们实现了所有基本层:数据、业务、通用等。此外,我们设法实现了一种继承机制,例如基类被添加为一个单独的模块,但实际上并未在 IoT Edge 部署 json 中定义。

希望这有所帮助。

于 2019-01-29T09:27:45.030 回答
0

还在 IoTEdgeDev GitHub 上将此作为问题发布。似乎随着 IoT Edge 的完整发布,一些事情发生了变化,他们将通过 IoT Edge Dev 的完整发布修复共享项目的错误。

@Michael Xu,我已经尝试过了,我得到了同样的例外。还尝试从我的项目中制作一个 NuGet 包并以这种方式添加它,但没有运气。

https://github.com/Azure/iotedgedev/issues/207

于 2018-07-27T07:23:27.550 回答