4

我有一个包含几个项目的解决方案。除了一个之外,其他都是类库项目,用于多种解决方案,作为 git 子模块包含在内,并且没有 .sln 文件,只有 .csproj 和 .cs 源。

像这样的东西(一行,一个存储库)

TheProgram: .sln, exe.csproj, .nuget/NuGet.{config,targets}, packages.config, .cs files
  submodule-0: sub-n.csproj, packages.config, and some .cs files
  submodules-1 to n: as above

在编译整个解决方案时,一切都运行良好 - 如果需要,会下载 nuget.exe,安装包,然后它就可以正常工作。

克隆使用 nuget 包的单个子项目,然后使用 msbuild 构建它失败。它找不到nuget.targets。查看 csproj 似乎是因为以下几行:

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

让一个项目引用一个以开头的路径..\..\对我来说感觉不对,但这是 nuget 生成的,我的手写 msbuild 脚本的经验非常有限。

我希望这个工作的原因是詹金斯,当我没有使用任何 nuget 包时,它在推送之后构建了解决方案的任何部分。

我可以看到一些方法来完成这项工作,例如可以将 nuget dir 添加到每个子模块并使用它,如果没有编译为解决方案的一部分,或者向每个 csproj 添加一些 BeforeBuild 命令行,或者向每个子模块添加一个 .sln。这些都不对。

我是不是做错了什么,当我停止这样做时,一切都会奏效吗?

如果没有,是否有人以不太难看的方式解决了类似的问题,还是我应该研究一下 msbuild 并自己做?

4

2 回答 2

0

我通过定义与SolutionDir属性相关的MSBuildProjectDirectory属性来使其工作:

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
于 2013-05-22T20:42:52.080 回答
0

您可以尝试将 nuget.config 添加到每个项目,将外部位置指定为存储库。

<configuration>
 <config>
     <add key="repositoryPath" value="c:\nuget" />
 </config>
 <packageSources>
     <add key="NuGet official package source" value="https://nuget.org/api/v2/" />
 </packageSources>
 <activePackageSource>
     <add key="All" value="(Aggregate source)" />
 </activePackageSource>
 <packageRestore>
     <add key="enabled" value="true" />
 </packageRestore>
</configuration>
于 2013-05-22T20:40:31.367 回答