Skip to content

Commit 765377b

Browse files
authored
Merge pull request #102 from dotnet-campus/t/lindexi-package
可以添加 NuGet 引用排除列表
2 parents dbc64fc + 78a4081 commit 765377b

File tree

14 files changed

+193
-17
lines changed

14 files changed

+193
-17
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,5 @@ paket-files/
258258

259259
# Python Tools for Visual Studio (PTVS)
260260
__pycache__/
261-
*.pyc
261+
*.pyc
262+
/src/dotnetCampus.SourceYard/Properties/launchSettings.json
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# 引用源代码包依赖的原理
2+
3+
`$(PackageId).props` 文件,也就是会在打包的时候,放在打出的源代码包,作为对应的源代码包的 Build 文件夹里面控制构建的 props 文件,在这个文件里面将当前源代码包的包 Id 加入到 SourceYardPackageReference 属性里面,如下面代码
4+
5+
```xml
6+
<PropertyGroup>
7+
<!-- 下面代码用来引用源代码包依赖 -->
8+
<SourceYardPackageReference>$(SourceYardPackageReference);#(PackageId)</SourceYardPackageReference>
9+
</PropertyGroup>
10+
```
11+
12+
这样在其他的项目,安装了源代码包,就可以通过 SourceYardPackageReference 属性了解当前项目安装了哪些源代码包
13+
14+
例如有项目 A 安装了 B 源代码包,那么通过 SourceYardPackageReference 属性就能拿到 B 源代码包
15+
16+
在将安装了源代码包的项目打包为源代码包时,例如将上面的 A 项目打包为源代码包时,想要添加 B 源代码包的引用依赖,就可以通过 SourceYardPackageReference 属性拿到当前 A 项目安装的源代码包,将这些源代码加入到依赖中
17+
18+
添加源代码包依赖的逻辑放在 Core.targets 里,将 SourceYardPackageReference 属性写入到 SourceYardPackageReferenceFile 文件里面
19+
20+
```xml
21+
<WriteLinesToFile File="$(SourceYardPackageReferenceFile)" Lines="$(SourceYardPackageReference)" Overwrite="true"></WriteLinesToFile>
22+
```
23+
24+
这个 SourceYardPackageReferenceFile 文件将会在 BuildProps 里面读取然后加入引用依赖
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# SourceYardExcludePackageReference
2+
3+
排除的依赖引用
4+
5+
在打源代码包的时候,有一些 NuGet 引用依赖不期望被加入源代码的依赖,以提升源代码包的兼容性
6+
7+
此时可以采用 SourceYardExcludePackageReference 机制,在 SourceYardExcludePackageReference 项里面添加的 NuGet 包 Id 内容,将不会被加入源代码包引用依赖
8+
9+
例如有项目 A 引用了两个 NuGet 包,分别是 B 和 C 库
10+
11+
```xml
12+
<ItemGroup>
13+
<PackageReference Include="B" Version="1.0.0" />
14+
<PackageReference Include="C" Version="1.0.0" />
15+
</ItemGroup>
16+
```
17+
18+
而项目 A 不期望打出的源代码包,包含了 B 和 C 库的依赖。可以在项目文件里面添加 SourceYardExcludePackageReference 列表,如下面代码
19+
20+
```xml
21+
<ItemGroup>
22+
<SourceYardExcludePackageReference Include="B" />
23+
<SourceYardExcludePackageReference Include="C" />
24+
</ItemGroup>
25+
```
26+
27+
此时打包出来的源代码包将不会包含 B 和 C 库的依赖
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
2+
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SDK/@EntryIndexedValue">SDK</s:String>
23
<s:Boolean x:Key="/Default/UserDictionary/Words/=docstates/@EntryIndexedValue">True</s:Boolean>
34
<s:Boolean x:Key="/Default/UserDictionary/Words/=nupkg/@EntryIndexedValue">True</s:Boolean>
45
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nuspec/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

src/dotnetCampus.SourceYard/Assets/Current/Core.targets

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
<SourceProjectPackageFile>$(SourcePackingDirectory)SourceProjectPackageFile.txt</SourceProjectPackageFile>
3838
<SourceYardPackageReferenceFile>$(SourcePackingDirectory)SourceYardPackageReferenceFile.txt</SourceYardPackageReferenceFile>
3939

40+
<!-- 表示不要包含的引用依赖列表 -->
41+
<SourceYardExcludePackageReferenceFile>$(SourcePackingDirectory)SourceYardExcludePackageReferenceFile.txt</SourceYardExcludePackageReferenceFile>
42+
4043
<SourceYardCompilePackageFile>$(SourcePackingDirectory)SourceYardCompilePackageFile.txt</SourceYardCompilePackageFile>
4144
<SourceYardResourcePackageFile>$(SourcePackingDirectory)SourceYardResourcePackageFile.txt</SourceYardResourcePackageFile>
4245
<SourceYardContentPackageFile>$(SourcePackingDirectory)SourceYardContentPackageFile.txt</SourceYardContentPackageFile>
@@ -45,13 +48,21 @@
4548
</PropertyGroup>
4649

4750
<ItemGroup>
51+
<!-- 这个 ItemGroup 里面存放的是加入到额外的文件引用里面 -->
52+
<!-- 用于支持附加文件功能 -->
53+
<!-- 这里面的 ItemGroup 所有的值最终将会写入到 SourceYardCompilePackageFile 文件 -->
54+
<!-- 此文件格式为每行一个文件的配置,包括文件所在的源代码路径以及放在源代码包的相对路径 -->
55+
<!-- 格式如下: 源代码路径 | 放在源代码包的相对路径 -->
56+
<!-- 如在源代码里面的 C:\dotnet-campus\F1\A.cs 需要放在源代码包里面的 F2\A1.cs 文件 -->
57+
<!-- 写入到文件内容如下:C:\dotnet-campus\F1\A.cs|F2\A1.cs -->
4858
<_SourceYardCompilePackage Include="%(SourceYardCompile.Identity)|%(SourceYardCompile.SourcePackagePath)"/>
4959
<_SourceYardResourcePackage Include="%(SourceYardResource.Identity)|%(SourceYardResource.SourcePackagePath)"/>
5060
<_SourceYardContentPackage Include="%(SourceYardContent.Identity)|%(SourceYardContent.SourcePackagePath)"/>
5161
<_SourceYardNonePackage Include="%(SourceYardNone.Identity)|%(SourceYardNone.SourcePackagePath)"/>
5262
<_SourceYardEmbeddedResourcePackage Include="%(SourceYardEmbeddedResource.Identity)|%(SourceYardEmbeddedResource.SourcePackagePath)"/>
5363

5464
<!-- 这是给 SourceFusion 预编译生成的文件加入打包 -->
65+
<!-- 预编译生成的文件所在源代码包的路径和所在项目路径相同,都是 _SourceFusionIncludedCompileFile.Identity 这个值 -->
5566
<_SourceYardForSourceFusionCompilePackage Include="%(_SourceFusionIncludedCompileFile.Identity)|%(_SourceFusionIncludedCompileFile.Identity)"/>
5667
</ItemGroup>
5768

@@ -118,6 +129,10 @@
118129
<WriteLinesToFile File="$(SourceYardCompilePackageFile)" Lines="@(_SourceYardCompilePackage)" Overwrite="true"></WriteLinesToFile>
119130
<!-- 这是给 SourceFusion 预编译生成的文件加入打包,写入在 SourceYardCompilePackageFile 文件 -->
120131
<WriteLinesToFile File="$(SourceYardCompilePackageFile)" Lines="@(_SourceYardForSourceFusionCompilePackage)"></WriteLinesToFile>
132+
<!-- 写入表示不要包含的引用依赖列表,这部分的 NuGet 包依赖将会忽略 -->
133+
<WriteLinesToFile File="$(SourceYardExcludePackageReferenceFile)"
134+
Lines="@(SourceYardExcludePackageReference)"
135+
Overwrite="true"/>
121136

122137
<WriteLinesToFile File="$(SourceYardResourcePackageFile)" Lines="@(_SourceYardResourcePackage)" Overwrite="true"></WriteLinesToFile>
123138
<WriteLinesToFile File="$(SourceYardContentPackageFile)" Lines="@(_SourceYardContentPackage)" Overwrite="true"></WriteLinesToFile>
@@ -128,8 +143,15 @@
128143

129144
<!--打包第三步,无论多框架还是单框架只执行一次-->
130145
<Target Name="SourceYardStep3">
146+
<PropertyGroup>
147+
<!-- 给定默认的 SourceYard 路径名 -->
148+
<SourceYardApplicationFilePath Condition="'$(SourceYardApplicationFilePath)' == ''">$(MSBuildThisFileDirectory)..\tools\net45\dotnetCampus.SourceYard.exe</SourceYardApplicationFilePath>
149+
</PropertyGroup>
150+
151+
<Error Text="Can not find SourceYardApplicationFilePath $(SourceYardApplicationFilePath)" Condition="!Exists($(SourceYardApplicationFilePath))"/>
152+
131153
<Exec
132-
Command="$(MSBuildThisFileDirectory)..\tools\net45\dotnetCampus.SourceYard.exe $(SourceMSBuildProjectFullPath) $(SourceIntermediateDirectory) $(SourcePackageOutputPath) $(SourceYardPackageVersion) --Compile $(CompileTextFile) --Resource $(ResourceTextFile) --Content $(ContentTextFile) --Page $(PageTextFile) --ApplicationDefinition $(ApplicationDefinitionTextFile) --None $(NoneTextFile) --EmbeddedResource $(EmbeddedResourceTextFile) $(SourceYardAuthors) $(SourceYardRepositoryUrl) $(SourceYardRepositoryType) $(SourceYardPackageProjectUrl) $(SourceYardCopyright) $(SourceYardDescription) $(SourceYardTitle) $(SourceYardPackageLicenseUrl) $(SourceYardPackageReleaseNotes) $(SourceYardPackageTags) $(SourceYardOwner) $(SourceYardPackageId) $(SourcePackageReferenceVersion) --SourcePackingDirectory $(SourcePackingDirectory) --TargetFrameworks &quot;$(TargetFrameworks) &quot; --TargetFramework &quot;$(TargetFramework) &quot;">
154+
Command="$(SourceYardApplicationFilePath) $(SourceMSBuildProjectFullPath) $(SourceIntermediateDirectory) $(SourcePackageOutputPath) $(SourceYardPackageVersion) --Compile $(CompileTextFile) --Resource $(ResourceTextFile) --Content $(ContentTextFile) --Page $(PageTextFile) --ApplicationDefinition $(ApplicationDefinitionTextFile) --None $(NoneTextFile) --EmbeddedResource $(EmbeddedResourceTextFile) $(SourceYardAuthors) $(SourceYardRepositoryUrl) $(SourceYardRepositoryType) $(SourceYardPackageProjectUrl) $(SourceYardCopyright) $(SourceYardDescription) $(SourceYardTitle) $(SourceYardPackageLicenseUrl) $(SourceYardPackageReleaseNotes) $(SourceYardPackageTags) $(SourceYardOwner) $(SourceYardPackageId) $(SourcePackageReferenceVersion) --SourcePackingDirectory $(SourcePackingDirectory) --TargetFrameworks &quot;$(TargetFrameworks) &quot; --TargetFramework &quot;$(TargetFramework) &quot;">
133155
</Exec>
134156
</Target>
135157

src/dotnetCampus.SourceYard/Assets/Current/build/PackageId.targets

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
55
</PropertyGroup>
66

7-
<Import Project="..\build\Core.targets"/>
7+
<!-- 在调试下的路径是不存在的 -->
8+
<Import Project="..\build\Core.targets" Condition="Exists('..\build\Core.targets')" />
9+
<!-- 只有调试下在存在此文件 -->
10+
<Import Project="..\Core.targets" Condition="Exists('..\Core.targets')" />
811

912
<!-- 单框架项目入口 -->
1013
<Target Name="BuildSourceNuGet" AfterTargets="Build"

src/dotnetCampus.SourceYard/Assets/Target/build/$(PackageId).props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
</PropertyGroup>
1414

1515
<PropertyGroup>
16+
<!-- 下面代码用来引用源代码包依赖 -->
1617
<SourceYardPackageReference>$(SourceYardPackageReference);#(PackageId)</SourceYardPackageReference>
1718
</PropertyGroup>
1819
</Project>

src/dotnetCampus.SourceYard/PackFlow/NuspecFileGenerator.cs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Linq;
5-
using System.Text;
65
using System.Text.RegularExpressions;
7-
using System.Xml;
8-
using System.Xml.Linq;
96
using System.Xml.Serialization;
107
using dotnetCampus.SourceYard.Context;
118
using dotnetCampus.SourceYard.PackFlow.Nuspec;
@@ -89,16 +86,34 @@ private NuspecPackage GetNuspec(IPackingContext context)
8986
PackageLicenseUrl = buildProps.PackageLicenseUrl,
9087
PackageTags = buildProps.PackageTags,
9188
PackageReleaseNotes = buildProps.PackageReleaseNotes,
92-
Dependencies = GetDependencies(context.PackageReferenceVersion, buildProps.SourceYardPackageReferenceList),
89+
Dependencies = GetDependencies(context.PackageReferenceVersion,
90+
buildProps.SourceYardPackageReferenceList,
91+
buildProps.SourceYardExcludePackageReferenceList),
9392
Repository = repository
9493
}
9594
};
9695
}
9796

97+
/// <summary>
98+
/// 获取依赖
99+
/// </summary>
100+
/// <param name="contextPackageVersion">引用的NuGet包于版本号</param>
101+
/// <param name="sourceYardPackageReferenceList">源代码包</param>
102+
/// <param name="excludePackageReferenceList">排除的依赖</param>
103+
/// <returns></returns>
98104
private List<NuspecDependency> GetDependencies(string contextPackageVersion,
99-
List<string> sourceYardPackageReferenceList)
105+
List<string> sourceYardPackageReferenceList, List<string> excludePackageReferenceList)
100106
{
101-
return ParserPackageVersion(contextPackageVersion, sourceYardPackageReferenceList);
107+
var nuspecDependencyList = ParserPackageVersion(contextPackageVersion, sourceYardPackageReferenceList);
108+
109+
// 如果在排除列表就移除
110+
if (excludePackageReferenceList.Count > 0)
111+
{
112+
var excludeList = new HashSet<string>(excludePackageReferenceList);
113+
nuspecDependencyList.RemoveAll(temp => excludeList.Contains(temp.Id));
114+
}
115+
116+
return nuspecDependencyList;
102117
}
103118

104119
private List<NuspecDependency> ParserPackageVersion(string packageVersionFile,
@@ -108,7 +123,7 @@ private List<NuspecDependency> ParserPackageVersion(string packageVersionFile,
108123
var packageVersionRegex = new Regex(@"Name='(\S+)' Version='([\S|\-]+)' PrivateAssets='(\S*)'");
109124
using (var stream = File.OpenText(packageVersionFile))
110125
{
111-
string line;
126+
string? line;
112127
while ((line = stream.ReadLine()) != null)
113128
{
114129
var match = packageVersionRegex.Match(line);

src/dotnetCampus.SourceYard/Utils/BuildProps.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,18 +142,31 @@ public void SetSourcePackingDirectory(string packingDirectory)
142142
RepositoryUrl = configuration.GetValue("RepositoryUrl")?.Trim() ?? string.Empty;
143143
}
144144

145-
var sourceYardPackageReferenceFile = Path.Combine(packingDirectory, "SourceYardPackageReferenceFile.txt");
145+
const string sourceYardPackageReferenceFile = "SourceYardPackageReferenceFile.txt";
146+
147+
SourceYardPackageReferenceList = GetList(sourceYardPackageReferenceFile);
146148

147-
List<string> sourceYardPackageReferenceList = File.ReadAllLines(sourceYardPackageReferenceFile).Where(temp => !string.IsNullOrEmpty(temp)).ToList();
148-
SourceYardPackageReferenceList = sourceYardPackageReferenceList;
149-
150-
var sourceYardCompilePackageFile = Path.Combine(packingDirectory, "SourceYardCompilePackageFile.txt");
149+
const string sourceYardExcludePackageReferenceFile =
150+
"SourceYardExcludePackageReferenceFile.txt";
151+
SourceYardExcludePackageReferenceList = GetList(sourceYardExcludePackageReferenceFile);
151152
}
152153

154+
/// <summary>
155+
/// 排除的依赖引用列表
156+
/// </summary>
157+
/// 有某些 NuGet 引用不想作为源代码的依赖,可以添加到 SourceYardExcludePackageReference 列表
158+
public List<string> SourceYardExcludePackageReferenceList { get; private set; } = null!;
159+
153160
/// <summary>
154161
/// 安装的源代码包列表
155162
/// </summary>
156163
/// 用于解决 https://github.com/dotnet-campus/SourceYard/issues/60
157164
public List<string> SourceYardPackageReferenceList { get; private set; } = null!;
165+
166+
private List<string> GetList(string fileName)
167+
{
168+
var file = Path.Combine(SourcePackingDirectory, fileName);
169+
return File.ReadAllLines(file).Where(temp => !string.IsNullOrEmpty(temp)).ToList();
170+
}
158171
}
159172
}

src/dotnetCampus.SourceYard/dotnetCampus.SourceYard.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<Nullable>enable</Nullable>
77
<LangVersion>latest</LangVersion>
88
<TargetFrameworks>net45;netcoreapp2.0</TargetFrameworks>
9+
<MSBuildWarningsAsMessages>$(MSBuildWarningsAsMessages);NETSDK1138</MSBuildWarningsAsMessages>
910
</PropertyGroup>
1011

1112
<PropertyGroup>
@@ -31,8 +32,8 @@
3132

3233
<ItemGroup>
3334
<PackageReference Include="dotnetCampus.CommandLine.Source" Version="3.3.0" PrivateAssets="All" />
34-
<PackageReference Include="dotnetCampus.Configurations.Source" Version="1.3.0" PrivateAssets="All" />
35-
<PackageReference Include="Walterlv.NullableAttributes.Source" Version="5.9.0" PrivateAssets="All" />
35+
<PackageReference Include="dotnetCampus.Configurations.Source" Version="1.5.1" PrivateAssets="All" />
36+
<PackageReference Include="Walterlv.NullableAttributes.Source" Version="5.10.2" PrivateAssets="All" />
3637
</ItemGroup>
3738

3839
<ItemGroup Condition="$(TargetFramework)=='net45'">

0 commit comments

Comments
 (0)