使用 NuGet 和 mono 解决命名空间解析
Resolving namespace resolution with NuGet and mono
问题:是否可以运行 mono的msbuild
强制使用特定的目录作为特定的命名空间。例如,命名空间 DevExpress
可以映射到目录 /app/MyApp/DevExpress
。或者,如果这不是一个选项,我们如何让我们的项目知道新安装的 NuGet 包?
一些背景信息:几年前,我们继承了一个(非常)遗留的应用程序堆栈,included.NET 个应用程序使用 DevExpress 构建了我使用的 3 个应用程序套件客户 运行 他的活动。我们不了解 .NET(客户被警告并接受了这一点,希望专注于他的 Web 应用程序),但我们设法稳定了它,并且已经使用 PowerShell 和 msbuild 编译了几年。
我们希望今年能使这个客户的很多流程自动化,以节省我们自己很多时间。作为其中的一部分,我们希望在我们的 CI 服务器上自动编译 .NET 应用程序,并推送压缩文件,以便在客户端需要新安装时随时部署。
项目最初没有使用 NuGet,但为了自动化所有这些,我们认为我们可以设置一个 Docker 带有 mono 的容器,使用 nuget 来提取依赖项和然后编译。
遗憾的是,我们目前遇到了困难,因为命名空间解析似乎不起作用。
"/app/MyApp/MyApp.csproj" (default target) (1) ->
"/app/DataAccessLayer/DataAccessLayer.csproj" (default target) (3:2) ->
(CoreCompile target) ->
xp Server Objects/dbo_CITY.cs(6,7): error CS0246: The type or namespace name 'DevExpress' could not be found (are you missing a using directive or an assembly reference?) [/app/DataAccessLayer/DataAccessLayer.csproj]
编辑:我将 zivkan 的回答标记为正确,因为虽然它没有给我一个我可以去实施的解决方案,但它给了我(希望这个问题)很多前进的有用信息。
构建 .NET 项目并非如此(在路径 x 中查找名称空间 y)。相反,除了源文件之外,编译器还会得到一个要引用的 dll 列表,并且编译器会扫描所有引用的元数据以查看可用的 namesspaces/classes。我相信 Java 的工作方式与 jar 文件大致相同,尽管我从未在 Java.
中做过任何严肃的事情
通常的工作方式是使用 Visual Studio(或另一个了解 .NET 的 IDE)并使用集成工具将 NuGet 包添加到项目中,如install a package with Visual Studio quickstart docs。如果您使用 .NET Core,则可以从命令行使用 dotnet add package <package id
。这会修改项目文件 (.csproj),因此构建系统知道它(如果您使用 PackageReference
,那么您自己直接编辑 csproj 就足够简单了,但如果使用 packages.config
,您绝对需要工具为你做)。
那么CI构建过程是先下载nuget.exe然后运行nuget.exe restore
,然后再构建项目,或者使用.NET Core时运行 dotnet restore
和 dotnet build
(因为 .NET Core 2.0 恢复作为构建的一部分自动发生,所以不再需要执行单独的步骤)。这也是使用 .NET Core 的另一个优势,不再需要下载 nuget.exe 来恢复,最终 NuGet 内置到构建系统中(技术上我认为 non-SDK 风格的项目也可以用 PackageReference
和 msbuild -restore
).
您收到有关缺少名称空间的错误消息这一事实告诉我您可能没有 运行 nuget restore
在 CI 机器上,或者您可能没有以通常的方式使用 NuGet。
问题:是否可以运行 mono的msbuild
强制使用特定的目录作为特定的命名空间。例如,命名空间 DevExpress
可以映射到目录 /app/MyApp/DevExpress
。或者,如果这不是一个选项,我们如何让我们的项目知道新安装的 NuGet 包?
一些背景信息:几年前,我们继承了一个(非常)遗留的应用程序堆栈,included.NET 个应用程序使用 DevExpress 构建了我使用的 3 个应用程序套件客户 运行 他的活动。我们不了解 .NET(客户被警告并接受了这一点,希望专注于他的 Web 应用程序),但我们设法稳定了它,并且已经使用 PowerShell 和 msbuild 编译了几年。
我们希望今年能使这个客户的很多流程自动化,以节省我们自己很多时间。作为其中的一部分,我们希望在我们的 CI 服务器上自动编译 .NET 应用程序,并推送压缩文件,以便在客户端需要新安装时随时部署。
项目最初没有使用 NuGet,但为了自动化所有这些,我们认为我们可以设置一个 Docker 带有 mono 的容器,使用 nuget 来提取依赖项和然后编译。
遗憾的是,我们目前遇到了困难,因为命名空间解析似乎不起作用。
"/app/MyApp/MyApp.csproj" (default target) (1) ->
"/app/DataAccessLayer/DataAccessLayer.csproj" (default target) (3:2) ->
(CoreCompile target) ->
xp Server Objects/dbo_CITY.cs(6,7): error CS0246: The type or namespace name 'DevExpress' could not be found (are you missing a using directive or an assembly reference?) [/app/DataAccessLayer/DataAccessLayer.csproj]
编辑:我将 zivkan 的回答标记为正确,因为虽然它没有给我一个我可以去实施的解决方案,但它给了我(希望这个问题)很多前进的有用信息。
构建 .NET 项目并非如此(在路径 x 中查找名称空间 y)。相反,除了源文件之外,编译器还会得到一个要引用的 dll 列表,并且编译器会扫描所有引用的元数据以查看可用的 namesspaces/classes。我相信 Java 的工作方式与 jar 文件大致相同,尽管我从未在 Java.
中做过任何严肃的事情通常的工作方式是使用 Visual Studio(或另一个了解 .NET 的 IDE)并使用集成工具将 NuGet 包添加到项目中,如install a package with Visual Studio quickstart docs。如果您使用 .NET Core,则可以从命令行使用 dotnet add package <package id
。这会修改项目文件 (.csproj),因此构建系统知道它(如果您使用 PackageReference
,那么您自己直接编辑 csproj 就足够简单了,但如果使用 packages.config
,您绝对需要工具为你做)。
那么CI构建过程是先下载nuget.exe然后运行nuget.exe restore
,然后再构建项目,或者使用.NET Core时运行 dotnet restore
和 dotnet build
(因为 .NET Core 2.0 恢复作为构建的一部分自动发生,所以不再需要执行单独的步骤)。这也是使用 .NET Core 的另一个优势,不再需要下载 nuget.exe 来恢复,最终 NuGet 内置到构建系统中(技术上我认为 non-SDK 风格的项目也可以用 PackageReference
和 msbuild -restore
).
您收到有关缺少名称空间的错误消息这一事实告诉我您可能没有 运行 nuget restore
在 CI 机器上,或者您可能没有以通常的方式使用 NuGet。