我有#34;下载丢失的软件包"在
项目文件最初是在VS 2013中创建的
使用MSBuild任务构建解决方案的build.proj。
<MSBuild Projects ="$(root)\src\MySolution.sln" ContinueOnError ="false" Properties="Configuration=$(Configuration)">
<Output ItemName="OutputFiles" TaskParameter="TargetOutputs"/>
</MSBuild>
我的google-fu让我失望,任何和所有想法都会得到很好的接受。
答案 0 :(得分:8)
var map = {}
for (var i = 0; i < 3; i++) {
map["key"+i] = i
}
ref.child("values").update(map)
的项目需要通过NuGet恢复,而不是MSBuild。 Visual Studio通过VS请求构建时执行此操作。如果需要从命令行执行此操作,则需要使用命令行packages.config
实用程序来还原软件包。
只有nuget.exe
引用NuGet包的方式被集成到MSBuild中。您可以通过从项目中卸载所有NuGet包,并更改默认包管理格式或选择“允许在第一个包安装时选择格式”复选框来切换到此格式。然后,您可以重新添加软件包(只需要顶级软件包),并确保它不会生成PackageReference
文件。
这里有一些问题:
恢复后,MSBuild必须重新评估项目文件。在CI脚本中使用packages.config
任务时,只有在将一组不同的属性传递给任务时才会发生这种情况。这是因为还原会在<MSBuild>
目录中生成在评估期间检查的自动导入文件。
如果还原没有生成,但是更改这些文件,这还不够,并且必须使用干净的xml缓存重新评估项目。 obj\
任务无法做到这一点。 MSBuild 15.5引入了<MSBuild>
选项来执行/restore
目标,然后清理这些缓存(之前没有API)并按要求执行构建的其余部分。在15.5之前,需要对Restore
进行两次单独的调用,以确保增量恢复+构建产生正确的输出。
如果要使用msbuild.exe
的CI构建项目,最安全的方法是创建具有还原和构建目标的PackageReference
:
build.proj
使用
执行<Project>
<Target Name="Restore">
<MSBuild Projects="$(root)\src\MySolution.sln" Targets="Restore" />
</Target>
<Target Name="Build">
<MSBuild Projects="$(root)\src\MySolution.sln" Targets="Build" />
</Target>
</Project>
答案 1 :(得分:3)
我发现调用nuget restore MySolution.sln
会恢复解决方案的包。
我将nuget.exe
放入我的构建文件夹中,并对源代码树中的每个解决方案运行restore。
我的MsBuild目标是恢复所有解决方案中所有项目的包。
<Target Name="NuGetRestore">
<ItemGroup>
<slns Include="$(MSBuildProjectDirectory)\..\**\*.sln"/>
</ItemGroup>
<Exec Command="$(MSBuildProjectDirectory)\nuget restore %(slns.Identity)"/>
</Target>
Nuget.exe
不必位于每个项目文件夹中,只需在包含build的文件夹中。
答案 2 :(得分:0)
我还遇到了MSBuild不拉包的问题。我使用RestoreConfigFile
将路径nuget.config
文件添加到属性参数
RestoreConfigFile=$(MSBuildStartupDirectory)\.nuget\nuget.config
并且还更改了MSBuild任务上的Targets值:
MSBuild Targets="Restore;Clean;Build" Projects=...
Restore
目标实际上强制拉包,RestoreConfigFile
将其指向我的设置。