我尝试在Visual Studio Online上构建存储在外部GIT-Repository中的解决方案。
它有以下步骤:
1:Git Restore - Works
2:NuGet Restore - Works
3:构建 - 不起作用
我在查看日志时的第一个猜测是MsBuild没有找到NuGet存储它们的包。 来自NuGet Restore的一些行:
2018-03-14T21:10:11.0352862Z Completed installation of AngleSharp 0.9.9
2018-03-14T21:10:11.0353230Z Adding package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages'
2018-03-14T21:10:11.0353563Z Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages'
2018-03-14T21:10:11.0354972Z Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages' from source 'https://api.nuget.org/v3/index.json' 'Microsoft.SharePointOnline.CSOM.16.1.7317.1200' to folder 'D:\a\1\s\packages'
MsBuild的一些行:
018-03-14T21:10:21.2105399Z PrepareForBuild:
2018-03-14T21:10:21.2105793Z Creating directory "bin\Release\".
2018-03-14T21:10:21.2424947Z Creating directory "obj\Release\".
2018-03-14T21:10:30.3569560Z ResolveAssemblyReferences:
2018-03-14T21:10:30.3570425Z Primary reference "AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL".
2018-03-14T21:10:30.3670272Z ##[warning]C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2041,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly "AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
我的解决方案/包结构是:
....\mysolution\myproject\myproject.csproj
....\mysolution\myproject\packages.config
当前配置: 那么如何更改Nuget和/或msbuild行为才能使其工作?
(更新):要清除这一点:我在每个包中遇到此问题。它们都在packages.config中,每个都是从Nuget下载的,但每个都没有从MsBuild中找到
(Update2)生成的命令目前如下: 的NuGet:
D:\a\_tool\NuGet\4.4.1\x64\nuget.exe restore D:\a\1\s\AweCsomeO365\packages.config -PackagesDirectory D:\a\1\a\packages -Verbosity Detailed -NonInteractive -ConfigFile D:\a\1\Nuget\tempNuGet_22.config
MSBUILD:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe" "D:\a\1\s\AweCsomeO365\AweCsomeO365.csproj" /nologo /nr:false /dl:CentralLogger,"D:\a\_tasks\VSBuild_(GUID)\1.126.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll";"RootDetailId=(GUID)|SolutionDir=D:\a\1\s\AweCsomeO365"*ForwardingLogger,"D:\a\_tasks\VSBuild_(GUID)\1.126.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=D:\a\1\a /p:ReferencePath=D:\a\1\a\packages /p:platform="anyCPU" /p:configuration="Release" /p:VisualStudioVersion="15.0" /p:_MSDeployUserAgent="VSTS_(GUID)_build_4_22
我更换了GUID; tempNuGetConfig似乎是由VSTS动态生成的
静止。即使日志声明nuget存储包
Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\a\packages'
MsBuild似乎没有在那里找到它们:
For SearchPath "D:\a\1\a\packages".
2018-03-16T13:57:42.4625155Z Considered "D:\a\1\a\packages\AngleSharp.winmd", but it didn't exist.
2018-03-16T13:57:42.4625456Z Considered "D:\a\1\a\packages\AngleSharp.dll", but it didn't exist.
2018-03-16T13:57:42.4625730Z Considered "D:\a\1\a\packages\AngleSharp.exe", but it didn't exist.
VSTS-Configurationvalues:
MsBuild:/p:ReferencePath=$(Build.StagingDirectory)\packages
Nuget-DestiantionDirectory:$(Build.StagingDirectory)\packages
(update3):我有没有解决方案文件,但只有该存储库中的csproj文件
答案 0 :(得分:1)
我认为您的MSBuild“ReferencePath”参数不正确。你告诉MS Build所有你的引用(包括nuget包及其dll)将位于“D:\ a \ 1 \ a \ packages”,但这不是nuget下载和存储包和dll的地方。 Nuget会将文件下载并解压缩到D:\ a \ 1 \ a \ packages \ {packageName} \ {version} \ lib \ {environment} \ package.dll。我认为您需要从MSBuild参数中删除最后一个参数(ReferencePath)。
我还注意到您的PackageLocation参数与NuGet还原任务的目标不同,是否需要将“\ packages”添加到该参数,如还原任务中的目标?
答案 1 :(得分:1)
问题是项目内部有一个提示路径指向不在GIT-Repository内的位置(并且不应该):
<Reference Include="AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL">
<HintPath>..\..\AweCsome365Test\packages\AngleSharp.0.9.9\lib\net45\AngleSharp.dll</HintPath>
</Reference>
我最初的方法是为NuGet定义一个目标目录,为MSBuild定义一个源目录,以便将另一个位置用于两者都能理解的包。
虽然问题(据我所知)是,NuGet总是创建一个子文件夹结构"./packages/{PackagesName}/lib/net45/{file}"
,并且在将"./packages"
设置为源路径时,MSBuild看起来不会递归。
以上只是对未来遇到同样问题的人的解释
所以我的解决方案是模仿nuget的本地行为并更改输出目录以匹配HintPath(即使没有&#34; AweCsome365Test&#34;) - 存储库中的目录:
(我会把这个问题留下来,因为这个解决方案闻起来很腥。如果有人有一个更好的解决方案,允许链接nuget和msbuild而不使用HintPath我很乐意花费我的赏金)
答案 2 :(得分:0)
将nuget restore目标目录更改为$(Build.SourcesDirectory)\ packages并删除msbuild ReferencePath参数。
答案 3 :(得分:0)
这里的答案基本上是正确的。但是,值得注意的另一个原因可能导致这种行为。我的工具链使用的是Azure DevOps,与几年后的Visual Studio Online基本相同。
原因:
这是在安装软件包时利用软件包的 solution 位置。
对于.Net核心/标准项目,使用Update-Package -reinstall似乎可以解决问题。但是,对于.Net Framework项目,即使packages.json
可能会被重建,<HintPath />
中的.csproj
节点也会保留原样-引用Azure永远不会创建的packages文件夹
简单修复:
../../OtherRepo/packages
的提示路径(使用的斜杠可能会有所不同),并将其更改为../packages
这种方法将解决由于在错误的位置合并/更新程序包而导致的问题,而不是需要更改构建管道来欺骗该位置(在某些情况下,效果也不佳)。