dotnet-campus / SourceYard

Add a NuGet package only for dll reference? By using dotnetCampus.SourceYard, you can pack a NuGet package with source code. By installing the new source code package, all source codes behaviors just like it is in your project.
MIT License
50 stars 12 forks source link

Internal classes and change namespace to avoid conflictions #47

Closed walterlv closed 4 years ago

walterlv commented 5 years ago
  1. 提供属性设置 SYInternalAllClasses 可以将所有的类型变成 internal,避免被引用时导致的类型冲突;
    • 如果你就是使用源代码包提供 API,就保持默认值 False
    • 如果你使用源代码包仅仅为了辅助你的库实现某些复杂功能,而不打算将源代码包带的类型作为 API 对外提供,则设置为 True
  2. 提供属性设置 SYLocalRootNamespace 可以修改源代码包中携带源代码的命名空间,避免被引用时导致的类型冲突;
    • 如果你就是使用源代码包提供 API,可以考虑设置一个自己期望的命名空间,如 Walterlv.Demo.Utils(注意,被保护的命名空间无法被设置更改)
    • 如果你使用源代码包仅仅为了辅助你的库实现某些复杂功能,则可以留空
  3. 提供单个源代码包用于覆盖全局的 SYLocalRootNamespace 属性,如 WalterlvDemoLocalRootNamespace,其优先级高于全局属性。
  4. 为了保护知识产权,打源代码包的项目可以通过指定 SYPreventRedirectNamespace 属性为 True 来阻止以上属性生效。
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
    <RootNamespace>Cvte.EasiPlugins</RootNamespace>

    <!-- 全局将所有未被保护的源代码包的命名空间设置成自己项目默认的根命名空间。 -->
    <SYLocalRootNamespace>$(RootNamespace)</SYLocalRootNamespace>

    <!-- 单独将 Walterlv.Windows 源代码包的命名空间设置成 dotnetCampus.Windows。 -->
    <WalterlvWindowsLocalRootNamespace>dotnetCampus.Windows</WalterlvWindowsLocalRootNamespace>

    <!-- 将所有从源代码包引入的公共类型的访问修饰符改为 internal。 -->
    <SYInternalAllClasses>True</SYInternalAllClasses>

    <!-- 单独将 Walterlv.Windows 源代码包引入的公共类型的访问修饰符改为 internal。 -->
    <WalterlvWindowsInternalAllClasses>True</WalterlvWindowsInternalAllClasses>

  </PropertyGroup>

</Project>
lindexi commented 5 years ago

SY 很诡异,建议作为 SourceYard 全部

walterlv commented 5 years ago

可以解决 #48

walterlv commented 5 years ago

实现了 #49 的方法二

walterlv commented 5 years ago

一个建议,可以使用以下方式授权命名空间:

<PropertyGroup>

    <RootNamespace>Walterlv.Utils</RootNamespace>

    <SourceYardAuthorizedNamespaces>dotnetCampus.Utils;lindexi.Utils</SourceYardAuthorizedNamespaces>

</PropertyGroup>
walterlv commented 5 years ago

一个建议,可以使用以下方式授权命名空间:

<PropertyGroup>

    <RootNamespace>Walterlv.Utils</RootNamespace>

    <SourceYardAuthorizedNamespaces>dotnetCampus.Utils;lindexi.Utils</SourceYardAuthorizedNamespaces>

</PropertyGroup>

此方法的缺陷就是,如果某个开源组织发布的源代码包需要授权给非开源项目使用,那么就暴露了非开源项目的命名空间了,这变相暴露了非开源项目的所在组织。

lindexi commented 4 years ago

这个功能放在 https://github.com/dotnet-campus/dotnetCampus.SourceYard.Extras 工具