找回密码
 立即注册
首页 业界区 安全 如何在 DotNet 中使用类似 golang 的 vendor 的编译模式 ...

如何在 DotNet 中使用类似 golang 的 vendor 的编译模式

乳杂丫 昨天 19:15
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!

  • cnblogs博客
  • zhihu
  • Github
  • 公众号:一本正经的瞎扯
    1.png

一个项目中,存在部分库是公司内的,且需要配置个人的用户名和密码连接到 NuGet 站点,才能下载这些库。
而有时候需要直接把一个仓库拉到某个环境上进行编译,且不希望把带了密码的 NuGet.Config 文件提交到代码仓库中。
能不能把公司内的库放到类似 golang 的 vendor 目录下?然后编译机器拉到仓库后就能直接编译,而不再依赖公司的 NuGet 站点了。
下面是我的做法:
下载所有依赖库

在项目根目录中定义一个配置完整的 NuGet.Config 文件,取名为: NuGet.Config.for.download
NuGet.Config.for.download
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3.   <packageSources>
  4.     <clear />
  5.    
  6.    
  7.   </packageSources>
  8.   <packageSourceMapping>
  9.    
  10.     <packageSource key="Internal">
  11.       <package pattern="MyCompany.*" />
  12.     </packageSource>
  13.    
  14.     <packageSource key="nuget.org">
  15.       <package pattern="*" />
  16.     </packageSource>
  17.   </packageSourceMapping>
  18.   <packageSourceCredentials>
  19.     <Internal>
  20.       
  21.       
  22.     </Internal>
  23.   </packageSourceCredentials>
  24. </configuration>
复制代码
这个文件用于第一次使用时下载库,这个文件不必提交到仓库。
下载所有依赖库
  1. mkdir -p ./vendor/public/
  2. dotnet restore --configfile ./NuGet.Config.for.download --packages ./vendor/public/
复制代码
指定配置文件,把所有依赖项下载到 /vendor/public/ 目录。
下载好后,把公司内部的库移动到另一个目录:
  1. rm -fdr ./vendor/private/ ; mkdir -p ./vendor/private/ && \
  2.         mv ./vendor/public/MyCompany.* ./vendor/private/
复制代码
编译

用于编译的 NuGet.Config 配置

新增一个专门用于 vendor 模式的 NuGet.Config 配置文件,取名为:NuGet.Config.vendor
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3.   <packageSources>
  4.     <clear />
  5.    
  6.    
  7.   </packageSources>
  8.   <packageSourceMapping>
  9.    
  10.     <packageSource key="Internal">
  11.       <package pattern="MyCompany.*" />
  12.     </packageSource>
  13.    
  14.     <packageSource key="nuget.org">
  15.       <package pattern="*" />
  16.     </packageSource>
  17.   </packageSourceMapping>
  18. </configuration>
复制代码
基于 vendor 目录的 restore
  1. dotnet restore --configfile ./NuGet.Config.vendor -r linux-x64
复制代码
编译
  1. dotnet publish MyProj.csproj \
  2.                 --no-restore \
  3.                 -c Debug -r linux-x64 \
  4.                 -o ./build/linux/amd64/
复制代码
最关键的参数是 --no-restore
docker 中编译
  1. docker run --rm  \
  2.         --platform linux/amd64 \
  3.         -v "./":/src \
  4.         -w /src/ \
  5.         mcr.microsoft.com/dotnet/sdk:8.0 \
  6.         bash -c ' \
  7.                 dotnet restore --configfile ./NuGet.Config.vendor -r linux-x64 && \
  8.                 dotnet publish MyProj.csproj \
  9.                         --no-restore \
  10.                         -c Debug -r linux-x64 \
  11.                         -p:PublishAot=false \
  12.                         -p:PublishSingleFile=false \
  13.                         -p:IncludeNativeLibrariesForSelfExtract=true \
  14.                         -p:EnableCompressionInSingleFile=true \
  15.                         -p:GenerateDocumentationFile=false \
  16.                         -p:StripSymbols=false \
  17.                         -p:DebugType=portable \
  18.                         -p:DebugSymbols=true \
  19.                         -p:EmbedUntrackedSources=true \
  20.                         -p:EmbedAllSources=true \
  21.                         -p:ContinuousIntegrationBuild=true \
  22.                         -p:Optimize=false \
  23.                         -o /src/build/linux/amd64/ \
  24.         '
复制代码
提交到 git

.gitignore 文件中增加一些配置:
  1. NuGet.Config.for.download  # 用于下载的文件,不提交到仓库,里面有密码
  2. /vendor/public/  # public 文件太多了,不提交到仓库
  3. !/vendor/private/  # 说明这个目录一定要提交
  4. !/vendor/private/**/*nupkg  # .nupkg 类型的文件一定要提交
复制代码
好了,在别的环境 git clone 后,使用上述提到的编译命令行就可以编译了。

希望对你有用, Have fun.
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册