Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio MsBuild和Visual Studio的不同结果_Visual Studio_Msbuild - Fatal编程技术网

Visual studio MsBuild和Visual Studio的不同结果

Visual studio MsBuild和Visual Studio的不同结果,visual-studio,msbuild,Visual Studio,Msbuild,我有一个解决方案,它由两个项目组成:针对.NET 4.5+网站的常规类库(不是web应用程序)项目 当我使用Visual Studio构建此解决方案时,来自Nuget软件包和本地引用的所有引用程序集都会复制到网站项目的bin文件夹中 如果尝试使用MsBuild生成解决方案,则网站项目的MsBuild-bin文件夹不会收到任何程序集 未选择在VS配置中构建网站项目(在这两种情况下均通过消息报告) 编辑-以下是附加说明 当我从网站的git-bin文件夹克隆项目时,该文件夹仅包含4个已签入的程序集:

我有一个解决方案,它由两个项目组成:针对.NET 4.5+网站的常规类库(不是web应用程序)项目

当我使用Visual Studio构建此解决方案时,来自Nuget软件包和本地引用的所有引用程序集都会复制到网站项目的bin文件夹中

如果尝试使用MsBuild生成解决方案,则网站项目的MsBuild-bin文件夹不会收到任何程序集

未选择在VS配置中构建网站项目(在这两种情况下均通过消息报告)

编辑-以下是附加说明

当我从网站的git-bin文件夹克隆项目时,该文件夹仅包含4个已签入的程序集:

如果我将使用/t:Build或/t:Rebuild和/p:Configuration=Release运行msbuild命令;Platform=“Any CPU”-在我的另一个项目中,我只会收到postbuild事件的输出,包括在解决方案中:

然而,若我在Release/Debug config-bin中执行从VS(Ctrl+Shift+b)构建,那个么我就拥有运行web应用程序所需的所有程序集。

编辑2:链接到示例解决方案-

当使用
msbuild TestApp.sln/t:Rebuild/p:Configuration=Release构建它时;Platform=“Any CPU”
-这只会导致在
~\Test.Web\bin\
(其中Test.Web是网站项目)找到Test.Core.*和LetsEncrypt.Umbraco.dll(最初签入)。如果使用VisualStudio 2015构建TestApp.sln(我想2013年和2017年是一样的)~\Test.Web\bin\将获得全部程序集

MsBuild和Visual Studio的不同结果

这是因为二进制文件旁边的bin文件夹中的all
dll.refresh
文件被
.gitignore
忽略

由于网站项目没有任何项目文件(.csproj)来放置程序集引用,因此MSBuild使用
*.dll.refresh
文件来理解程序集引用。文件内容是通过解决方案的packages文件夹指向
.dll
的相对路径。当您忽略所有这些
.dll
.refresh by
.gitignore
时,MSBuild无法理解如何处理
dll
文件

为了测试这一点,我创建了一个网站项目,向其中添加一个nuget包,然后删除
dll
文件,但保留
.dll.refresh
文件在
bin
文件夹中。通过MSBuild命令行生成网站项目:

msbuild.exe TestWebsite.sln /t:Rebuild 
此命令完成后,
dll
文件将复制到
bin
文件夹

因此,构建和包还原要正常工作,您需要保留
.dll。刷新bin文件夹中的
文件。您可以从版本控制系统中删除其他二进制文件

注意:如果要恢复那些
.dll.refresh
,可以使用Package Manager控制台中的命令行:

update-package -reinstall

希望这能有所帮助。

您是否介意与我们共享github链接,以便我们重现此问题?请参阅最新版本2:)