查看: 94|回覆: 0

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

[複製鏈接]

2

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-5-12
發表於 2026-3-2 18:01:00 | 顯示全部樓層 |閲讀模式

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!

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

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

下面是我的做法:

下载所有依赖库

在项目根目录中定义一个配置完整的 NuGet.Config 文件,取名为: NuGet.Config.for.download

NuGet.Config.for.download

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <clear />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="Internal" value="https://my.company.com/repository/xxxx/" />
  </packageSources>

  <packageSourceMapping>
    <!-- Private packages should resolve from private feeds -->
    <packageSource key="Internal">
      <package pattern="MyCompany.*" />
    </packageSource>

    <!-- Public packages resolve from nuget.org -->
    <packageSource key="nuget.org">
      <package pattern="*" />
    </packageSource>
  </packageSourceMapping>

  <packageSourceCredentials>
    <Internal>
      <add key="Username" value="${USER}" />
      <add key="ClearTextPassword" value="${PASSWORD}" />
    </Internal>
  </packageSourceCredentials>
</configuration>

这个文件用于第一次使用时下载库,这个文件不必提交到仓库。

下载所有依赖库

mkdir -p ./vendor/public/
dotnet restore --configfile ./NuGet.Config.for.download --packages ./vendor/public/

指定配置文件,把所有依赖项下载到 /vendor/public/ 目录。

下载好后,把公司内部的库移动到另一个目录:

rm -fdr ./vendor/private/ ; mkdir -p ./vendor/private/ && \
	mv ./vendor/public/MyCompany.* ./vendor/private/

编译

用于编译的 NuGet.Config 配置

新增一个专门用于 vendor 模式的 NuGet.Config 配置文件,取名为:NuGet.Config.vendor

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <clear />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="Internal" value="./vendor/private/" />
  </packageSources>

  <packageSourceMapping>
    <!-- Private packages should resolve from private feeds -->
    <packageSource key="Internal">
      <package pattern="MyCompany.*" />
    </packageSource>

    <!-- Public packages resolve from nuget.org -->
    <packageSource key="nuget.org">
      <package pattern="*" />
    </packageSource>
  </packageSourceMapping>

</configuration>

基于 vendor 目录的 restore

dotnet restore --configfile ./NuGet.Config.vendor -r linux-x64

编译

dotnet publish MyProj.csproj \
		--no-restore \
		-c Debug -r linux-x64 \
		-o ./build/linux/amd64/

最关键的参数是 --no-restore

docker 中编译

docker run --rm  \
	--platform linux/amd64 \
	-v "./":/src \
	-w /src/ \
	mcr.microsoft.com/dotnet/sdk:8.0 \
	bash -c ' \
		dotnet restore --configfile ./NuGet.Config.vendor -r linux-x64 && \
		dotnet publish MyProj.csproj \
			--no-restore \
			-c Debug -r linux-x64 \
			-p:PublishAot=false \
			-p:PublishSingleFile=false \
			-p:IncludeNativeLibrariesForSelfExtract=true \
			-p:EnableCompressionInSingleFile=true \
			-p:GenerateDocumentationFile=false \
			-p:StripSymbols=false \
			-p:DebugType=portable \
			-p:DebugSymbols=true \
			-p:EmbedUntrackedSources=true \
			-p:EmbedAllSources=true \
			-p:ContinuousIntegrationBuild=true \
			-p:Optimize=false \
			-o /src/build/linux/amd64/ \
	'

提交到 git

.gitignore 文件中增加一些配置:

NuGet.Config.for.download  # 用于下载的文件,不提交到仓库,里面有密码
/vendor/public/  # public 文件太多了,不提交到仓库
!/vendor/private/  # 说明这个目录一定要提交
!/vendor/private/**/*nupkg  # .nupkg 类型的文件一定要提交

好了,在别的环境 git clone 后,使用上述提到的编译命令行就可以编译了。

希望对你有用, Have fun. 😃



来源:https://www.cnblogs.com/ahfuzhang/p/19660265
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部