网站首页

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > .Net >

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

时间:2026-03-02 18:01

人气:

作者:admin

标签:

导读:作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 一个项目中,存在部分库是公司内的,且需要配置个人的用户名和密码连接到...

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


一个项目中,存在部分库是公司内的,且需要配置个人的用户名和密码连接到 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/ \
	'

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

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

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

希望对你有用, Have fun. ????

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信