【问题标题】:How do I build code out of a tutorial repo that has many examples (in Visual Studio/C#)如何从包含许多示例的教程存储库中构建代码(在 Visual Studio/C# 中)
【发布时间】:2017-08-08 03:16:22
【问题描述】:

如何在 Visual Studio 中从课程或教程构建示例代码,并将其拆分为存储库中的文件夹?

所以 - 我几乎是 C# 的菜鸟,我已经阅读了很多教程并浏览了一些大型 C# 项目并构建了它们,还做了一些其他的小事。我正在学习在Pluralsight 上编写可测试代码的课程。他有一个用于代码示例的公共 Github 存储库,writing-testable-code。我连接到存储库并将其下载到本地 Git 存储库中。我能够从 NuGet 下载所有包,它们都显示为他使用的版本(一些有更新,但我认为更新可能会破坏事情)。

我不知道如何运行、构建或运行其中的测试。

到目前为止我尝试了什么

我的问题是 - 我打开了解决方案,并且有一堆文件和文件夹 - 每个模块/章节都分为文件夹(即 Module1/Easy、Module1/Hard、Module2/Easy 等)。 我想构建 Module1/Easy 文件夹,包括单元测试示例,并运行测试

在查看 Module1/Easy 时,它有 3 个文件应该可以构建 - program.cs 有一个 main() 并且看起来像一个控制台应用程序,Calculator.cs 有一个简单的类,而 CalculatorTests.cs 有一个单元为 Nunit 构建的测试。该解决方案包含 NUnit、Castle.core 以及来自后续模块(Moq、AutoMoq、Unity、Ninject 等)的内容。它似乎没有 VS 运行器,所以我添加了 Nunit3TestAdapter - 课程中的那个人安装了 resharper,我没有,他正在使用 Resharper 测试运行器,这可以解释为什么他没有包括它.

我尝试将“Module1/Easy/Project.cs”文件设置为“设置为启动项”,因为它有一个主应用程序并且看起来设置为控制台应用程序。但是,运行它(“开始”按钮变成了“Program.cs”按钮),它无法运行 dll。测试没有像我从示例中构建的其他一些小项目一样显示在测试资源管理器中。

这样做的正确方法是什么?

我不知道从这里去哪里。在构建菜单上只有一个“构建解决方案”和一个关于代码分析的 - 我已经习惯了这里有更多的选项。感觉好像我必须把这个文件夹变成一个项目,也许吧?我总是可以重新安装软件包 - 但这里最好的解决方案是什么?

我之前在其他书籍、教程或课堂回购中遇到过这个问题,但最终决定弄清楚如何让这个工作。感谢您的帮助!

注意事项

  1. 我目前正在运行 Visual Studio Community 2017。
  2. 我可以发布一些文件,但 repo 是公开可用的,我不确定要发布什么来提供帮助。

来自 cmets 的进展和答案

  1. 根据 Biker-Dude 的回答,我将项目切换为构建控制台应用程序而不是 dll,现在由于具有多个入口点而出现编译时错误(即每个模块和子文件夹都有自己的 Main()功能,可能应该是一个单独的项目)。
  2. 在 #1 之后,我从解决方案中删除了除一个之外的所有文件夹,然后它将编译、运行测试等 - 但我最终希望能够至少单独编译每个子文件夹 - 最好的方法是什么?

【问题讨论】:

  • 对于初学者的课程来说,这简直是令人困惑:一个项目有多个入口点,而同一个项目也用于测试?不好..
  • 我认为他是在使用 repo 作为一次性转储所有代码示例的一种方式 - 问题是,我过去曾多次遇到过同样的问题。我通常只是浏览了 repo 中的代码,或者我自己已经有一个单独的项目/解决方案,所以我只是复制了某些东西。但我一直很烦恼,因为我不知道处理这种情况的正确方法。答案可能是只下载文件夹并构建一个单独的解决方案,并使用每个文件夹中的单独项目正确构建它。如果是这样,我可以接受!

标签: c# visual-studio msbuild solution


【解决方案1】:

问题一定是项目必须将输出类型设置为类库。浏览解决方案树并:

选择你班级的项目> 右键 > 属性 > 应用程序 > 输出类型 > 控制台应用程序/Windows 应用程序。

如果其他设置正确,这应该可以解决它。

【讨论】:

  • 这让我进入了下一步,但现在它因“多个入口点错误”而失败 - 这正是我所期望的。由于每个模块都有多个“迷你项目”,每个都有自己的 Main() 函数,我现在不知何故需要将项目缩小到仅一个文件夹。就像每个文件夹应该是它自己的项目,然后我可以构建我感兴趣的项目。话虽如此,测试类现在可以构建和运行! :)
  • 您唯一能在此处获取 1 个 exe 文件的方法是从项目中排除除 1 个 program.cs 文件之外的所有文件。或者创建 X 个项目,每个 exe 一个。
  • LightCC 您可以右键单击 > 点击卸载无用的项目,如果这样可以更好地满足您的情况。此外,您可以将其他项目转换为依赖项,并且仍然使用来自各个类的方法。如果您确实想要多个 exe 文件(假设您想做应用程序多线程),我需要做一些研究并回复您。另外,不要点击开始,编译并进入 bin,然后单独运行这些 exe 文件。如果要调试它们,请在编译之前将 Debugger.Launch() 命令添加到代码中。
  • 所以,我确实删除了每个模块文件夹和 Module1/Hard 文件夹,所以只剩下 Module1/Easy,然后它就可以编译了。如何重新添加其他文件夹不太清楚(似乎只想添加单个文件,我无法重新创建与已删除文件夹同名的新文件夹)。我应该为每个子文件夹制作单独的项目,然后将它们单独添加到每个项目中吗?然后我可以单独构建项目并在该级别控制它们,对吗?
  • 我可以右键单击解决方案树中的(解决方案或文件夹或项目)并仍然添加>新文件夹。不能吗?
【解决方案2】:

在 BikerDude 的回答和 stijn 的 cmets 的帮助下,我最终能够解决这个问题并让一些事情发挥作用。

首先,在这种情况下不要尝试排除任何文件夹,这只会让事情变得更糟!它们仍将位于您的基础文件夹/存储库中,只是不会出现在您的解决方案中的任何地方,并且您将无法创建具有相同名称的新文件夹(奇怪的决定......)。而且您必须将它们作为单独的文件重新添加 - 我认为。

最好的解决方案(到目前为止)

最好的解决办法似乎是:

  1. 为解决方案中的每个可构建文件集创建一个新项目(在我的情况下,每个“模块”文件夹至少一个项目)。我使用“.Net 框架控制台应用程序”项目类型(右键单击解决方案,使用添加/新建项目)来使事情正常工作,但这取决于您下载的特定课程或教程存储库。

  2. 将包含您要构建的文件的文件夹或子文件夹从主解决方案中移出并移到新项目中 - 您可以单击并拖动来移动它。

  3. Visual Studio 将在您的项目中创建一个空的、预先格式化的文件,您可能必须删除该文件 - 对于 .Net 应用程序,这是 C# 中的“Program.cs”文件。对于我的一个文件夹,这个文件已经存在,我必须删除新的才能构建。来自不同模块的另一个文件夹的设置更像是一个库,无法独立构建,但这个过程确实让我能够构建文件,并允许单元测试显示在测试资源管理器中并成功运行测试(这是该模块的重点)。

  4. 转到解决方案并右键单击并选择“管理解决方案的 Nuget 包”。只要为主要解决方案安装了所有软件包,它们就会全部显示在已安装软件包列表中(您可能需要单击“已安装”选项卡)。您可以依次单击每个包,然后在右侧您可以选中新项目,并且“安装”按钮应该可用 - 单击它。对所有软件包重复以安装它们。请注意,如果您先创建所有需要的项目,则可以在此处删除一些重复,然后您可以在此步骤中同时安装所有这些项目(即一次选中所有新项目,而不是每次都重新打开包管理器)。

  5. 您可能必须修复 NameSpace - 它应该在您从原始解决方案传输的文件/文件夹中保持一致,但如果您添加任何新文件来处理内容,它的 Namespace 可能会不匹配,并且要查看原始文件中的类等,您必须在新文件上更新您的命名空间。

  6. Per BikerDude 的回答 - 将所有内容转移到新项目后,如果您在原始项目中保留了解决方案附带的任何内容,则可能不会尝试构建正确类型的项目。您可以通过右键单击项目、选择属性并调整“输出类型”来解决此问题,但它可能没有您需要的选项。如果没有,只需创建一个具有正确类型的新项目并按上述方式传输文件。

完成上述步骤后,我能够使用我移动的文件夹中的原始文件构建我创建的每个新项目。主要是我只需要构建,它启用了本教程/课程所关注的所有单元测试,但这也允许我构建控制台应用程序,如果存在的话。

感谢大家的帮助,为我指明了正确的方向!

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2020-08-20
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多