是否有可能使NuGet.exe运行与Visual Studio断开连接?
我已经和NuGet搏斗了几天,现在我正在转向StackOverflow,希望这里的某个人能够友好地指引我朝着正确的方向前进。是否有可能使NuGet.exe运行与Visual Studio断开连接?
我已经使用NuGet几次简单的单人宠物项目,但这是我第一次将它用于我真正关心的事情,并希望有完全连续的构建等。创建一个简单的NAnt构建脚本来获取Git的源代码,确保外部依赖关系已被取消,编译并运行测试 - vanilla CI。
我最初走的路试图获得解决方案恢复工作,但它只是没有工作,或者我没有如何工作。 Visual Studio不在构建服务器上,并且不会安装在那里 - 这不是一个选项。顺便说一句,我不能让解决方案恢复工作,只需两个开发人员(一个试图降低源代码并干净地构建)。我假设这是因为“允许解决方案恢复”必须在任何地方打开(并且不是默认情况下)。在我深入研究之前,我对这种方法进行了处理 - 坦率地说,让我的软件包管理器与IDE紧密结合使我感到不舒服,并希望能以另一种方式做到这一点。我习惯使用的包管理器是简单的命令行工具 - CI构建脚本在构建时调用它,开发人员按需执行。我花了最近两个小时试图在NuGet源代码中使用最近30分钟的工作。我觉得我正在与该工具作斗争并需要重新启动。
有没有人有任何在多开发人员+ CI场景中使用NuGet的例子?这就是我想要的:
- 任何及所有的开发者可以得到源和3次或更少的 点击(优选1)运行测试。如果二进制文件不在本地存在,那将被JIT提取。如果他们在那里,他们会根据需要进行更新等等。理想情况下,甚至不需要安装NuGet(即NuGet.exe需要在我的回购库中)。
- 通过像Jenkins,TeamCity等CI服务器执行#1(最好使用相同的脚本)
- 如果它不过度对抗工具,我希望所有这些从Visual Studio中断开连接, .config文件和所有二进制文件转储到repo根目录中的单个Lib文件夹中。
任何指针将非常感激。
下面,我怎么觉得你可以实现每个先决条件:
- 你需要“启用NuGet包还原”,在您的解决方案:http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages
-
As @ alexander-doroshenko为TeamCity提到,您可以使用Nuget安装程序:http://confluence.jetbrains.com/display/TCD7/NuGet+Installer,但是如果您希望在Jenkins中运行脚本,请为每个项目尝试以下操作(作为TC工作,作为命令行步骤):
nuget.exe安装“[Project folder]/packages”。配置” -source‘’-solutionDir‘’-OutputDirectory‘套餐’
这必要将项目1和2进行
TeamCity为此构建了一个名为“NuGet Installer”的构建步骤,它从.sln文件获取所需的包并在本地下载。它不需要Visual Studio运行。
了解更多关于在这里:http://confluence.jetbrains.com/display/TCD7/NuGet+Installer
有集成的NuGet到您的构建过程中的几个不同的解决方案取决于你需要多少集成,在我们的例子中,我们希望使用NuGet作为包管理器,并允许开发人员构建他们的解决方案,即使他们没有在他们的机器上安装NuGet,为了这个工作,我们启用了包恢复, NuGet二进制文件到您的解决方案文件夹并更新项目文件请注意,NuGet并不总是正确地更新项目文件。在我们的案例中,我们发现一些项目文件去吨更新,但其他人没有。要验证项目是否已更新,您需要以XML文件的形式打开项目文件。为了实现这个负载的解决方案,并右键点击相关项目并选择卸载项目。然后再次右键单击该项目并选择编辑[PROJECT_NAME]。在项目文件中,您应该看到
- A
RestorePackages
第一个属性组中的属性。此属性的值应为true
- 在项目文件的最后一个
import
语句。这个导入语句应该指向NuGet二进制文件附带的'NuGet.targets文件。
下面是我们的项目文件(大量编辑)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir>
<ProjectGuid>{8B467882-7574-41B2-B3A8-2F34DA84BE82}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>MyCompany.MyNamespace</RootNamespace>
<AssemblyName>MyCompany.MyNamespace</AssemblyName>
<!-- Allow NuGet to restore the packages if they are missing -->
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<Import Project="$(SolutionDir)\BaseConfiguration.targets" />
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="MyClass.cs" />
<!--
.... MANY MORE FILES HERE
-->
</ItemGroup>
<!-- Import the Nuget.targets file which integrates NuGet in the build process -->
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
你需要采取的下一步是提供解决方案级别的NuGet配置文件的一个示例中,你会指出需要“安装”软件包的位置以及package repository的URL是什么。在我们的情况下,解决方案目录结构如下:
(D) root
(D) build
(D) packages
(D) source
(D) .nuget
NuGet.config
NuGet.exe
NuGet.targets
(D) MyCoolProject
MyCoolProject.csproj
MyCoolProject.sln
(D) templates
NuGet.Config
凡(D)
表示目录。
NuGet.config
文件包含以下配置设置。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageRestore>
<add key="enabled" value="True" />
</packageRestore>
<config>
<add key="repositorypath" value="packages" />
</config>
<packageSources>
<add key="OurPackageServer" value="PACKAGE_SERVER_ADDRESS" />
</packageSources>
<activePackageSource>
<add key="All" value="(Aggregate source)" />
</activePackageSource>
</configuration>
该配置文件指示包恢复被启用,该储存库路径(其中,包被放置)是包目录和包源是活动的。
通过在根目录下放置一个NuGet.config文件,我们可以在NuGet中使用hierarchical configuration选项。这允许单个解决方案覆盖计算机特定的配置。另一个好处是,这样我们就不需要在构建服务器上安装NuGet(因为可执行文件和配置在存储库中)。
通过此设置,开发人员可以从Visual Studio构建解决方案。即使没有安装NuGet,构建也可以在开发人员机器上正常工作。但是请注意,如果没有在Visual Studio中安装NuGet,他们将无法将包添加到项目中。 在构建服务器上,您可以简单地使用MsBuild构建解决方案,该解决方案将自动从软件包存储库下载软件包。 Visual Studio不需要安装在构建计算机上(只是您选择的.NET框架)。
我非常感谢详细的解释。这听起来与我正在走下的路径非常相似。我相信我可以最终实现这个目标,但是这比我想要的更复杂(多个配置文件和voodoo路径解析,依赖于Visual Studio等)。我宁愿让一些简单的东西 - 单个文件充当清单,并且有一件事情可以阅读并完成任务。我会检查JetBrains的东西......谢谢你们。 – kellyb
这听起来像只是想我需要......如果它来自JetBrains我希望它会工作,并易于使用。 – kellyb