无法共享项目

时间:2018-07-25 10:00:42

标签: azure-iot-edge

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

但是当我要构建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)。

3 个答案:

答案 0 :(得分:0)

是的,据我所知,它不支持边缘模块的共享项目。但是您可以创建一个库项目,构建该项目,然后将dll添加为对模块项目的引用。它可以解决。您可以针对此要求发布反馈hereenter image description here

答案 1 :(得分:0)

也将此问题发布在IoTEdgeDev GitHub上。似乎在IoT Edge的完整版本中发生了一些问题,它们将在IoT Edge Dev的完整版本中修复共享项目的错误。

@Michael Xu,我已经尝试过了,并且遇到了同样的异常。还尝试过用我的项目制作一个NuGet软件包,并以这种方式添加它,没运气。

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

答案 2 :(得分:0)

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

COPY ReferencedProjectFolder/ReferencedProject.csproj ReferencedProjectFolder/

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

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

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

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

希望这会有所帮助。