我有一个解决方案,它由2个项目组成:.NET 4.5 +网站(不是 Web应用程序)项目的常规类库。
当我使用Visual Studio构建此解决方案时 - Nuget包中的所有引用程序集和本地引用都将复制到网站项目的bin文件夹中。
如果我尝试使用MsBuild构建解决方案 - 网站项目的bin文件夹没有收到任何程序集。
未选择在VS配置中构建网站项目(在两种情况下均由消息报告)
修改 - 这是补充说明。
当我从git克隆项目时,网站的bin文件夹只包含4个已签入的程序集:
如果我将使用/ t:Build或/ t运行msbuild命令:Rebuild和/ p:Configuration = Release; Platform =“Any CPU” - 我将在我的其他项目中收到postbuild事件的输出,包括解决方案:
但是,如果我在发布/调试配置中从VS执行构建( Ctrl + Shift + b ) - bin具有所有必需的程序集用于运行Web应用程序。
编辑2 :链接到示例解决方案 - https://github.com/akuryan/csharp-website-test
当使用msbuild TestApp.sln /t:Rebuild /p:Configuration=Release;Platform="Any CPU"
构建它时 - 这会导致在~\Test.Web\bin\
找到Test.Core。*和LetsEncrypt.Umbraco.dll(最初签入)(其中Test.Web是网站项目) 。如果用VisualStudion 2015构建TestApp.sln(我想,2013和2017将是相同的) - ~\Test.Web\bin\
获得全部的程序集。
答案 0 :(得分:1)
MsBuild和Visual Studio的不同结果
这是因为dll.refresh
忽略了二进制文件旁边的bin文件夹中的所有.gitignore
文件。
由于Web站点项目没有任何项目文件(.csproj)来放置程序集引用,因此MSBuild使用*.dll.refresh
文件来理解程序集引用。该文件的内容是解决方案的packages文件夹中.dll
的相对路径。当您忽略所有.dll
。刷新.gitignore
时,MSBuild无法理解如何处理dll
文件。
为了测试这个,我创建了一个网站项目,向其中添加了一个nuget包,然后删除了dll
文件,但将.dll.refresh
文件保存在bin
文件夹中。通过MSBuild命令行构建网站项目:
msbuild.exe TestWebsite.sln /t:Rebuild
完成此命令后,dll
文件将复制到bin
文件夹。
因此,构建和打包还原工作似乎需要将.dll.refresh
文件保留在bin文件夹中。您可以从版本控制系统中删除其他二进制文件。
注意:如果要重新获得.dll.refresh
,可以使用程序包管理器控制台中的命令行:
update-package -reinstall
希望这有帮助。