NuGet.exe 下载地址

本文翻译自:

基本步骤

  1. 使用 nuget spec 命令生成 nuspec 文件
  2. 编辑 nuspec 文件,使用 nuget pack 命令打包

从程序集创建程序包

执行以下命令:生成  nuspec 文件:

nuget spec MyAssembly.dll

按需编辑 nuspec 文件后执行打包命令:

nuget pack MyAssembly.nuspec

从项目文件创建程序包

在项目文件夹执行:

nuget spec

工具会读取 csproj 或 vbproj 文件生成 nuspec 文件。这种方式生成的 nuspec 文件包含一些可替换标记,打包时会用项目的元数据替换标记。可用标记包括:

  • $id$   用程序集名称替换
  • $version$    用 AssemblyVersionAttribute 或 AssemblyInformationalVersionAttribute 替换
  • $author$    用 AssemblyCompanyAttribute 替换
  • $description$    用 AssemblyDescriptionAttribute 替换

若不需要自动替换,可手工移除这些标记。

注意,使用项目文件执行打包命令才会替换这些标记,使用 nuspec 文件执行打包命令不会替换。

使用 files 节点显式指定程序包中包含哪些文件,例如:

<files>
<file src="..\..\SomeRoot\**\*.*" target="" />
</files>

程序包将仅包含这个节点中指定的文件,若 files 节点为空,则程序包将仅包含 lib 文件夹。另外 pack 命令会排除已句点开头的目录,例如 .git。

编辑好 nuspec 文件后,执行打包命令:

nuget pack MyProject.csproj

如果项目引用其他项目,可使用 -IncludeReferencedProjects 选项包含被引用项目的文件。假设有下图所示的引用结构:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAiYAAAH/CAIAAADsdYFrAAAWVklEQVR4nO3c7W3iShSAYddDCS6BQizKuBINuALKsJRaXAz3B1+GkOxuAnOOZ55Ho6sskGR3mPi9Yxy6IwAU0UX/BQBoheQAUIjkAFCI5ABQiOQAUIjkAFCI5ABQiOQAUIjkAFCI5ABQiOQAUIjkAFCI5ABQiOQAUIjkAFCI5ABQiOQAUIjkAFCI5ABQiOQAlfiv6/KM6MlIyrwAlfiv647HjwxDcr5iXoBKSE5+5gWohOTkZ16ASkhOfuYFqITk5GdegEpITn7mBaiE5ORnXoBKSE5+5gWohOTkZ16ASkhOfuYFqITk5GdegEpITn7mBaiE5ORnXoBKhL97dAvjl8+R5ACVyLPLqXVIDsCZ5EgOQCGSIzkAhUiO5AAUIjmSA1CI5EgOQCGSIzkAhcQkZ9713c0wFfmO/W6WHIBAYcm5BmDe9WWqEzQkB+AsPjmf/3ge+2GxDZrHzfkP/W6ed32/HfrFJmne9f1uHLqu207H5S5qOx0/jtP2/ImSAxAoRXKO++HUhts4jP1i6zPv+ssDpmE7zbu+24zzx/Gck9Mt18fvh8vH87jphv3XVZMcgIKSJufJAy5blsd790O3Gaf7M3V3Z+0u+x7JAYiVIjmfe/DdqbbtJDkAa5QgObfzYIsTaI8n1obxcDzffh+YaXt5defJF3RiDSCRBBdJX16VuUvO3WOG6XYpQT8e7j/92Sbm4fIByQHIYJW/CvqDfpw2Q5IDEKiB5Jx2SIu9lOQAhFhlclY1JAfgTHIkB6AQyZEcgEIkR3IACpEcyQEoRHIkB6AQyZEcgEIkR3IACpEcyQEoRHIkB6AQyZEcgEIkR3IACpEcyQEoRHIkB6AQyZEcgEIkR3IACpEcyQEoRHIkB6AQyZEcgEIkR3IACpEcyQEoRHIkB+CV/uu6b0b4QbnuITlA0y6lOUqO5AC80fUIeK1O+EG57iE5QFsejnrXXc5RciQH4FWWdbne8umP8cfliofkADX75hj3+S7JkRyAn/i8p3m494sb44/LFQ/JAerxl0e0rx4mOZID8Gff72n+/ouEH5TrHpIDrNXvj1/PvmD8cbniITnA+rxkT/P0y4YflOsekgNwJjmSA7Ru8QZob/9G4QfluofkAJxJjuTAH3z/xsCFR/Rk1CBwMsPXTwvjl8+RnzGC/Zfm/0wlB97NzxjBJGfVAvc0rJGFQjDJgXb4GSOY5KyLPQ2/YekQTHJWxBTxSxYQwSQnM3saXstiIpjkpGVCeDlLimCSk4c9De9meRFMcpJo/J9PGRYZwSQnUIP/ZGJZcASTnBDOoRHCmiOY5BRT/T+Q/CxBgklOAfY0JGEVEiz8nXFbGNFPMpxZiwTLs8updUgOeViLBJMcyaEd1iLBJEdyaIe1SDDJkRzaYS0STHIkh3ZYiwSTHMmhHdYiwSRHcmiHtUiwmOTMu767Gab3f7t+N0sOzbMWCRaWnGsDQnsgOTTFWiRYfHKmbTfsPz1mPyz2QPO4Of+h383zru+3Q7/YIc27vt+NQ9d12+m43EJtp9PXP32i5NA8a5FgCU6sbcb54QGHsV+cbZt3/Skex49p2E7zrr9+yrTtutMt18fvh8vH87g5x8yJNTgej5JDuPhdzucePN5y2vGcq3N/737oNuP0xVe7tkpy4Hg8Sg7h4pNz3A/XnHwVoWV4JAd+ylokWHxypu35hZbbCbTHE2vDeDieb78PzOlzHyPkxBo8Zy0SLMFrOYszZncfXy8QuF1K0I+HJ5/7UJSHywckBy6sRYKt71dBf9CP60ZKcmibtUiw2pNz2iF9vihOcmiRtUiw9SVnbUNyyMNaJJjkSA7tsBYJJjmSQzusRYJJjuTQDmuRYJIjObTDWiSY5EgO7bAWCSY5kkM7rEWCSY7k0A5rkWCSIzm0w1okmORIDu2wFgkmOZJDO6xFgkmO5NAOa5FgkiM5tMNaJJjkSA7tsBYJJjmSQzusRYJJjuTQDmuRYJIjObTDWiSY5EgO7bAWCSY5kkM7rEWCSY7k0A5rkWCSIzm0w1okmORIDu2wFgkmOQWScxrRTzVIDtEkp0ByFlMNkSxBgklOseQ8TLsCUZ41RzDJCUnOYvKhHAuOYJITmJyHJ0KBeDcrjGCSkyQ5i6cD3sXyIpjkpErOw1OjQLyW9UQwyUmbnMUTBK9hMRFMcpIn5+HJUiB+w+ohmOSsKDmLpwx+wtIhmOSsLjkPT58C8fesFYJJzqqTs3gS4c8sFIJJTgXJeXhCAwt0fUO5DCNqEjIzKQSTnMqSs3haA+RZTpLzlEkhWPj/irYwMjzFxb5XeGwk5xsmhRjZDou8W5mnWHKSMymU8zQwetOg9z3pkpOcSSGM/U3j3vHUS05yJoVgfjI5vm7fIznJmRQi+bFk6ffrQXKSMykU9fAqTuDfhOT+uO95eq/kJGdSKOTzVQOBfxnW4l+rIznJmRRi+IHkXz3d9zz7X5n43kjOV0wKAfw08mNfn0+7fhDfG8n5iknhXVwAzbst19jpA8lJzqTwFn7eKGZZHclJzqQAaxL+hnXGb54+yeFlfrkW4ff+S7PLqXVIDinoDRlIjuRQP70hCcmRHIBCJEdyqJOdDQlJjuRQm99ftQJvIjmSA1CI5EgOQCExyZl3fbe0Gec3f7t+N0sOFXMmjVUIS05cAySHqnjlhhXJmpz9cNkBDdPHPG7Of+h387zr++3Q3+49fbVx6LpuOx2XW6jtdPw4TtvzJ0oOQKwUJ9Yee3AY+26Ylg/eTseP4/FjGrbTvOuvJ+Kmbdedbrk+fj9cPp7HTTfs/65wkgPwfhl3OY/3nnY85+rc37sfus04LW6Z7z++7nskh2o4k8Z6rSE59+GRHFomNqxaouTcTqA9nlgbxsPxfPt9YKbt5dWdZYScWANIKcVrOafXZhav2SwfMEy3Swn68XD/uc82MQ+XD0gOa2dnQzXW96ugP+jHaTMkOayR3lCT2pNz2iG9+VdNJYc30Rsqs77krG1IDsCZ5EgOudjZUDHJkRyy8As3VE9yJAegEMmRHIBCJEdyCONMGq2RHMkhhtjQIMmRHIBCJEdyAAqRHMmhEK/cgORIDiWIDRwlR3IAipEcyeFd7GzggeRIDm+hN/CZ5EgOr6c38JTkSA5AIZIjObyGnQ38keRIDr/lF27gL0mO5AAUIjmSA1CI5EgO/8yZNPgZyak5OacjY5Lxm39IKjX9W6Awyak8OeH//pfMAlCHPAelWofkvGAWgDrkOSjVOiTnBbMA1CHPQanWITkvmAWgDnkOSrUOyXnBLAB1yHNQqnVIzgtmAahDnoNSrUNyXjALQB3yHJRqHZLzglkA6pDnoFTrkJwXzAJQhzwHpVqH5LxgFoA65Dko1Tok5wWzANQhz0Gp1iE5L5gFoA55Dkq1Dsl5wSwAdchzUKp1eCfpysdvniBoTfgPbAvjN09QJbucWofkADWRnNRDcoCaSE7qITlATSQn9ZAcoCaSk3pIDlATyUk9JAeoieSkHpID1GS9yTmMfdf1u7nA95p3fZlvJDlA1VabnHnX99uh34xz0F9AcgD+0VqTM4+bfjxMQ9ePh2cP2A/d2TB9zOPm/Id+N59bdbv3tIkZh67rttMpZuc7t9Px4zhtz58oOQC/s9LkHMbT/mbaPovBYey7Ybr8cd71p3gcP6ZhO827vrvsjaZt151uuT5+P1w+nsdNN+zPX0FyAH5tncm5NWA/dJ/OrT0W4rTjOVfn/t790G3GaXHLfP/xdd8jOQC/tsrk3E6Unc6WPZxbe16IS3gkByDIGpNzf97sem7tdgLt8cTacG7SYezvA3P63McIObEG8BYrTM6T82abcb57zWZxCUA3TLdLCfrxsLyre7qJebh8QHIAXmSFyXlxsf5iPL9IQXIA/o3kfD9OO6Sw3/6RHKAm7SVnVUNygJpITuohOUBNJCf1kBygJpKTekgOUBPJST0kB6iJ5KQekgPURHJSD8kBaiI5qYfkADWRnNRDcoCaSE7qITlATSQn9ZAcoCaSk3pIDlATyUk9JAeoieSkHpID1ERyUg/JAWoiOamH5AA1kZzUQ3KAmkhO6iE5QE0kJ/WQHKAmkpN6SA5QE8lJPSQHqInkpB6SA9REclIPyQFqIjmph+QANZGc1ENygJpITuohOUBNJCf1kBygJpKTekgOUBPJST0kB6iJ5KQekgPURHJSD8kBaiI5qYfkADWRnNRDcoCaSE7qITlATSQn9ZAcoCaSk3pIDlCT3ybHePd41TMNEM4RLZ6uAI1wsEvBhgZogcMcAIVIDgCFSE5GTrIBVXJoS0p1gPo4ruWlOkBlHNQAKERy1sGOB6iAA9lqqA6wdo5ia6I6wKo5hAH1CH9TRG+Q+D2TAtTjvzRvby85T5mUtfK/UfCZ5CRnUtbNsoYlyUnOpAD1kJzkTApQD8lJzqTUw6s7IDnJmZTaWOi0THKSMylAPSQnOZMC1ENykjMpNbPoaY3kJGdSKueaApoiOcmZFKAekpOcSQHqITnJmZS2+DGgbuHvHt3C+M0T5ADUHNWhYnl2ObUOyeGfqQ61khzJAShEciSH1Ox4qInkSA7ZqQ7VkBzJYQVUhzpIjuQAFCI5ksPK2PGwXjHJmXd9t7Sd3v3t+t0sOVRDdVipsOTENUByqIHqsEZZk7MfLjugYfqYx835D/1unnd9vx36272nrzYOl93SbQu1nY4fx2l7/kTJAYiV8sTaYey7YVo++PyAadhO867vNuP8cTzn5HTL9fH74fLxPG66Yf93hZMcgPfLuMt5vPe047lk6e7e/dBtxmlxy3z/8XXfIzlU7Pfv5QdlrCE59+GRHHhKdcgvUXJuJ9AeT6wN4+F4vv0+MNP28urOMkJOrAGklDI5dy/2DNPtUoJ+PNy/DvRsE/Nw+YDkACSxvl8F/UE/TpshyaEdTrKRU+3JOe2QLle4SQ7tcE0BCa0vOWsbkgNwJjmSA1CI5EgOTXCSjQwkR3JohVd3CCc5kgNQiORIDkAhkiM5NMpJNsqTHMmhXapDYZIjOTRNdShJciQHoBDJkRw4s+Ph3SRHcuBGdXgryZEcuKM6vI/kSA5AIZIjOQCFSI7kwJe+els2J9/4GcmRHPiDz4tYcvgZyZEc+AnV4SunzfF1PNwVflCue0gOdZIc/tKnAsUflysekkNVlgtadfij60ZHciQHfmJ5EIn+u5DadYXcfxB/XK54SA6r9/Sk/PWu8n8fcvpqnXzaGccflysekkM9Pr8sLDl8w+UDkgP/5iEzsSN6Mrj545Py9bY4/rhc8ZAc1i3PMUJyYv1T9b96ZJ7lVOuQHNYtzzFCcgK9avLzLKdah+SwbnmOEZJTzPvOZOZZTrUOyWHd8hwjJKcCeZZTrUNyWLc8xwjJeZOSV2fkWU61Dslh3fIcIyTnhaImM89yqnVIDuuW5xghOS8Re7l5nuVU65Ac1i3PMUJyfibVrzTlWU61Dslh3fIcI/IcN1ck26TlWU61Dslh3fIcI7IdPRPK/zYNeZZTrUNyWLc8x4jMR9JA65qWPMup1iE5rFueY8S6jq0FJN/QPBX+Nn0tjN88QStbT9RHcvJYY2NYF8uLYOH/y9bC+Msn4t3PNVhkBMuzy6l1PG3JP9UIXsWCI5jkFEuOwBDOEiSY5BRIjg0NSViFBJOcAsmJfpLhzFokmORIDu2wFgkmOZJDO6xFgkmO5NAOa5FgkcmZtt3VsH/v95p3fb+bJYe2WYsEi0rOPG66bjtd/jgNt48rG5JDHtYiwYKScxj7zTh//5j9cN0CTadEdV3Xdf1unnd9vx36272nTcw4dOeMzbvLndvpeNlO2eXQPGuRYDHJmXd99/225jD23TA9efw0bKd513eXYk3brjvdcn38frh8PI+b8yk7J9ZAcggXlpzvA/D4gNOO51Kpu3v3Q7cZp8Ut8/3H132P5NA8a5FgQSfW9kP37Ym154W4hEdy4EesRYLlunzgdgLt8cTaMB6O59vvAzNtL6/uLCPkxBo8YS0SLPAi6dsVAdeLpJev8dwuAeiG6XYpQT8elnd1TzcxD5cPSA4cj0fJIdwqfxX0B/04bYYkh7ZZiwRrIDmnHdIfr8mWHOpnLRJslclZ1ZAc8rAWCSY5kkM7rEWCSY7k0A5rkWCSIzm0w1okmORIDu2wFgkmOZJDO6xFgkmO5NAOa5FgkiM5tMNaJJjkSA7tsBYJJjmSQzusRYJJjuTQDmuRYJIjObTDWiSY5EgO7bAWCSY5kkM7rEWCSY7k0A5rkWCSIzm0w1okmORIDu2wFgkmOZJDO6xFgkmO5NAOa5FgkiM5tMNaJJjkSA7tsBYJJjmSQzusRYJJjuTQDmuRYJIjObTDWiSY5EgO7bAWCSY5kkM7rEWCSU6B5JxG9FMNkkM0ySmQnMVUQyRLkGCSUyw5n6YdSrPsCCY5Ick5zbzwUJgFRzDJiUoOlGctEkxykiTHpocCrDCCSU6S5CyeDngXy4tgkpMqOZ+eGnglS4pgkpM2OUdn23g1i4lgkpM5OfBa1iLBrr8bb7xvvPzJetUXpDWWDgCFSA7wczY9/BNrBfgt1eEvWSjAK8kP37A4gBdzto2vWBYAFCI5wHu5tJoriwCAQiQHKM2mp1medSDGO6oT/kYP73jTh5qYFCDeqw7Q/6V5yz7JecqkACm8ZGcgOcmZFKAekpOcSQEy+tmmR3KSMylAXt8fuD/fKznJmRRgHZ4exB9ulJzkTAqwGk/Pti1vkZzkTAqwetfju+QkZ1KAtVr+0uXiv/G9kZyvmBSgEpf8xPdGcr5iUoA1+Yu3mYnvjeR8xaQA9ZCc5EwKUA/JSc6kAPUIf/foFsZvniDJAeqRZ5dT65AcgDPJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKCUzOPG66i348vPfbzbu+382SAxAoKjnzuOluDTiMQ0wPJAegnKDk7IduM85/fMzZMC22RP1unnd9vx36272nTcw4dF23nY4fx3l3uXM7HT+O0/b8iZIDECgmOX8+zXUY+26YFo8/xeP4MQ3bad7112JN26473XJ9/H64fDyPm27Y/913lByAN4tOzmHsuydbkMdCnHY85+rc37sfus04LW6Z7z++7nskByBWihNrn3vwvBCX8EgOwBqluHzg2oPbCbTHE2vD+ZK2w9jfB2baXl7dWUbIiTWAfHJdJL14zWZxCUA3TLdLCfrxsLyre7qJebh8QHIAMljlr4L+oB+nzZDkAARqIDmnHdIfr8mWHIA3W2VyVjUkB+BMciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAKkRzJAShEciQHoBDJkRyAQiRHcgAK+a/rjHeP3zxBkgNAIZIDQCGSA0AhkgNAIZIDQCGSA0AhkgNAIZIDQCGSA0AhkgNAIZIDQCGSA0AhkgNAIZIDQCGSA0AhkgNAIZIDQCGSA0AhkgNAIZIDQCH/A+yxxGuZmjKPAAAAAElFTkSuQmCC" alt="" />

执行命令

nuget pack A.csproj -IncludeReferencedProjects

生成的程序包会包含项目 A,B,C,D,E,F,G中的文件。

如果被引用的项目有 nuspec 文件,则它将作为依赖项,例如 C.csproj 所在目录中有一个 C.nuspec 文件,执行以上命令后生成的程序包将包含项目 A,B,D,E 中的文件,并且有一个对 C 的依赖项。

默认情况下,NuGet 使用默认生成配置(通常是Debug),要打包 Release 配置的文件,可执行:

nuget pack MyProject.csproj -Prop Configuration=Release

visual studio 未提供修改默认生成配置的界面,要修改默认生成配置,需要手工编辑项目文件。

在生成时创建程序包

通过添加 AfterBuild 目标,可以在生成成功时自动创建程序包。手工编辑项目文件,加入以下内容:

<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release'">
<Exec Command="nuget pack $(ProjectFileName) -Prop Configuration=Release"></Exec>
</Target>

将在生成配置为 Release 时自动调用 nuget.exe 创建程序包。

从基于约定的目录创建程序包

除了程序集,程序包中还可包含源代码,PowerShell 脚本,可执行文件,配置文件等内容。NuGet 有一个对工作目录结构的约定:

  • tools。用于存放 powershell 脚本,以及可在程序包管理器控制台访问的程序。这个目录复制到目标项目后,将添加到 `$env:Path (PATH) 环境变量。
  • lib。安装程序包时,此文件夹下的程序集作为引用添加到目标项目。
  • content。安装程序包时,这个文件夹下的文件将复制到目标项目的根目录。
  • build。安装程序包时,自动插入到 .csproj 文件。

可以把 content 目录想象成目标项目的根目录。如果要在目标项目的 /images 目录添加一个图片文件,那么应把这个图片放在程序包的 content/images 文件夹中。

创建清单

请执行以下命令从头创建一个 spec 文件

nuget spec

将生成一个 XML 格式的 .nuspec 文件。

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MyPackageId</id>
<version>1.0</version>
<authors>philha</authors>
<owners>philha</owners>
<licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
<projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
<iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package description</description>
<tags>Tag1 Tag2</tags>
<dependencies>
<dependency id="SampleDependency" version="1.0" />
</dependencies>
</metadata>
</package>

将文件中的占位符改成实际的值,然后创建需要的目录并复制内容

mkdir lib
mkdir tools
mkdir content
mkdir content\controllers copy ..\src\SomeController.cs content
copy ..\src\MyLibrary lib
copy ..\src\SomePowershellScript.ps1 tools

准备好工作目录后,执行:

nuget pack YourPackage.nuspec

来打包文件。采用这种方式创建程序包不支持标记替换功能。

创建解决方案级程序包

解决方案级程序包用于向程序包管理器控制台按照工具或额外命令,但不添加引用,内容,也不修改生成过程。例如,psake 程序包安装 powershell 脚本帮助自动化生成过程。

如果程序包在 lib, content, build 目录中都没有文件,它就是解决方案级的,被它依赖项同样不能在 lib, content, build 目录中包含文件。

已安装的解决方案级程序包在 .nuget 目录的 package.config 文件中跟踪,而不是在特定项目的的 packages.config 文件中跟踪。

NuGet 3.0.0-3.2.0 不支持解决方案级程序包,变通的方式是安装到公共项目中。

程序包约定

框架版本文件夹结构

安装程序包时,NuGet 检查项目的目标框架,然后从 lib 文件夹中选择合适的子文件夹。使用以下命名约定指示程序集安装到哪个框架:

lib\{framework name}{version}

例如,下面的文件夹结构支持四个版本

\lib
\net11
\MyAssembly.dll
\net20
\MyAssembly.dll
\net40
\MyAssembly.dll
\sl40
\MyAssembly.dll

从 NuGet 2.0 开始,内容文件和 powershell 脚本也可按照目标框架分组,规则同 lib 文件夹。

\content
\net11
\MyContent.txt
\net20
\MyContent20.txt
\net40
\sl40
\MySilverlightContent.html \tools
init.ps1
\net40
install.ps1
uninstall.ps1
\sl40
install.ps1
uninstall.ps1

init.ps1 在解决方案级运行,与项目和目标框架无关,应直接放在 tools 文件夹中。

框架名称

NuGet 将文件夹名解析为 FrameworkName 对象,名称是区分大小写的,名称和版本号都可以使用缩写形式。

如果省略框架名称,则假定是 .Net Framework。例如,以下文件夹结构与上面的同义:

\lib
\11
\MyAssembly.dll
\20
\MyAssembly.dll
\40
\MyAssembly.dll
\sl4
\MyAssembly.dll

下表是有效的框架名称和缩写

框架名称 缩写
.NET Framework net
Silverlight sl
.NETMicroFramework netmf
Windows Store win
Windows Phone (Silverlight-based) wp
Windows Phone App (WinRT-based) wpa
 

框架版本无关的程序集

与框架版本无关的程序集直接放在 lib 文件夹中。

程序集版本和项目的目标框架的匹配

向项目安装具有多个程序集的程序包时,NuGet 会将程序集的框架名称同项目的目标框架进行匹配。若未找到匹配,NuGet 会排除大于项目框架版本的程序集,然后从剩余的程序集中选择最高版本。假设要把上例中的程序包安装到以 .net 3.5 为目标的项目中,实际安装的是 net20 文件夹中的程序集。

按照框架版本对程序集进行分组

NuGet 仅从一个库目录中复制文件,假设有以下目录

\lib
\Net20
\MyAssembly.dll (v1.0)
\MyAssembly.Core.dll (v1.0)
\Net40
\MyAssembly.dll (v2.0)

安装到以 .net4 为目标的项目时,仅安装 MyAssembly.dll (v2.0),不安装 MyAssembly.Core.dll (v1.0) 。若要安装 MyAssembly.Core.dll,要在 net40 中再包含一次。

仅从一个目录复制的规则也适用于根 lib 文件夹。有以下文件夹结构

\lib
\MyAssembly.dll (v1.0)
\MyAssembly.Core.dll (v1.0)
\Net40
\MyAssembly.dll (v2.0)

对于以 .net2.0 或 3.5 为目标的项目,NuGet 复制 MyAssembly.dll 和 MyAssembly.Core.dll。对于以 .net4.0为目标的项目,则仅复制 net40 中的 MyAssembly.dll。

在安装和卸载时自动运行 PowerShell 脚本

NuGet 按照命名约定自动运行 PowerShell 脚本:

  • Init.ps1 当程序包首次安装到解决方案后运行。

    • 程序包到解决方案的其他项目时不会运行。
    • 每次打开解决方案都会运行(程序包管理器控制台窗口必须打开)。
  • Install.ps1 当程序包安装到项目后运行。
    • 如果程序包安装到解决方案中的多个项目时,将为每个项目运行一次。
    • 程序包的 content 或 lib 目录存在文件时才会运行。仅在 tools 文件夹中存在文件不会运行。
    • 若 init.ps1 存在,install.ps2 在 init.ps1 之后运行。
    • [NuGet 3.x] 在使用 project.json 管理的项目中不运行。
  • Uninstall.ps1 在程序包卸载后运行。
    • [NuGet 3.x] 在使用 project.json 管理的项目中不运行。
  • 脚本文件应放在程序包的 tools 目录中。
  • 在文件顶部加上这样一行:param($installPath, $toolsPath, $package, $project)
    • $installPath 是安装目录。
    • $toolsPath 是安装目录下的 tools 目录。
    • $package 是程序包对象的引用。
    • $project 是 EnvDTE 项目对象的引用,它表示程序包安装到的项目。init.ps1 在解决方案级运行,因此 init.ps1 中为 null。
  • 编写脚本时,若要在控制台测试 $project,可设置为 $project = Get-Project。

可通过 NuGetPSVariables 程序包了解实际的输出,这个工具将信息写到日志中:

Install-Package NuGetPSVariables

NuGetPSVariables 程序包在显示日志文件后自动卸载。

用命令行工具创建 NuGet 程序包的更多相关文章

  1. ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application

    今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...

  2. Orchard中的命令行工具

    在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户.创建博客.生成代码.配置网站.打包模块等.并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类 ...

  3. 不能使用联机NuGet 程序包

    打开菜单栏>>工具>>选项>>NuGet 程序包管理器>>选择程序包源 勾选上nuget.org,即可使用联机的Nuget包  

  4. 如何创建一个基于命令行工具的跨平台的 NuGet 工具包

    命令行可是跨进程通信的一种非常方便的手段呢,只需启动一个进程传入一些参数即可完成一些很复杂的任务.NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法,同时还是一个 .NE ...

  5. 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具

    用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...

  6. Windows 编程,程序编译使用的命令行工具。

    Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件 ...

  7. Go使用flag包开发命令行工具

    flag包是Go语言标准库提供用来解析命令行参数的包,使得开发命令行工具更为简单 常用方法 1.flag.Usage 输出使用方法,如linux下ls -h的帮助输出 2.flag.Type(参数名, ...

  8. [Nuget]Nuget命令行工具安装

    下载 地址:https://www.nuget.org/downloads 直接下最新推荐版本(recommended latest)就好了. 是个单一的nuget.exe文件. 安装配置 想要在wi ...

  9. 十分钟通过 NPM 创建一个命令行工具

    大过年的,要不要写点代码压压惊?来花十分钟学一下怎么通过 NPM 构建一个命令行工具. 写了一个小 demo,用于代替 touch 的创建文件命令 touchme ,可以创建自带“佛祖保佑”注释的文件 ...

随机推荐

  1. mobx @computed的解读

    写在前面:我一开始看不懂官网的@computed的作用,因为即使我把@computed去掉,依然能正确的report,然后我百度谷歌都找不到答案,下面都是我自己的理解,如果是有问题的,不对的,请务必留 ...

  2. expect用法

    1. [#!/usr/bin/expect]  这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西.  注意: ...

  3. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  4. iframe用法

    <iframe src="http://caiyanli.top/" height="500"  width="500" frameb ...

  5. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

  6. React使用antd Table生成层级多选组件

    一.需求 用户对不同的应用需要有不同的权限,用户一般和角色关联在一起,新建角色的时候会选择该角色对应的应用,然后对应用分配权限.于是写了一种实现的方式.首先应用是一个二级树,一级表示的是应用分组,二级 ...

  7. 在开启DRS的集群中修复VMware虚拟主机启动问题

    通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态.因为有过上一次(VM ...

  8. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  9. 体验报告:微信小程序在安卓机和苹果机上的区别

    很多人可能会问:微信小程序和在微信里面浏览一个网页有什么区别? 首先,小程序的运行是全屏的,界面跟进入了一个APP很像,更为沉浸跟在微信里面访问h5不一样:其次,它的浏览体验更为稳定. 不过,这还不够 ...

  10. iOS--->微信支付小结

    iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...