在更新到Android Studio 3.0并创建一个新项目后,我注意到build.gradle有一种新方法可以添加新的依赖项,而不是compile存在implementation而不是testCompile存在testImplementation.
例:
implementation 'com.android.support:appcompat-v7:25.0.0'
testImplementation 'junit:junit:4.12'
Run Code Online (Sandbox Code Playgroud)
代替
compile 'com.android.support:appcompat-v7:25.0.0'
testCompile 'junit:junit:4.12'
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别,我应该使用什么?
dependency-management gradle transitive-dependency build.gradle gradle-plugin
我的许多罐子都有相互矛盾的传递依赖(多个弹簧版本).我想通过显式管理所有依赖项来避免继承的版本冲突,是否可以禁用Gradle中的所有传递依赖项?
我知道我可以添加transitive = false到每个依赖项中,但我希望有一种更简单的方法.
compile(group: 'org.springframework', name: 'spring', version: '2.5.2') {
transitive = false
}
Run Code Online (Sandbox Code Playgroud) 我的数据库设计中有一些传递依赖.我的上司告诉我,这些可能会导致错误.我发现很难找到资源,告诉我这些依赖项将如何导致错误.他们会引起什么样的问题?
我不是在争论这个事实,只是渴望了解它们可能导致什么样的问题.
编辑更多详细信息:
来自维基百科:
传递依赖
传递依赖是间接函数依赖,其中X→Z仅由X→Y和Y→Z组成.
我终于习惯了在我的项目中没有任何Used undeclared或Unused声明的依赖项.虽然很难跟踪依赖项中列出的未使用的声明的运行时/测试依赖项:analyze ...只需要在pom.xml中向它们写入注释,或者管理它们以了解测试或运行时需要它们.
但解决版本冲突的方式对我来说仍然不清楚.关于传递依赖性.
最近的胜利策略如何运作?何时使用其他版本的版本?
如果使用版本号声明Used undeclared依赖项 - 它总是获胜
如果没有明确指定依赖版本,Maven无法解决可能出现的与此依赖关系的任何版本冲突(很奇怪,但在这里写)
如果你没有声明Undeclared使用的依赖关系,它会从最近的级别选择一个传递依赖关系(nearest-wins策略),如果冲突在同一级别上,那么它会以某种方式决定版本A和版本B之间...也许是第一个处理延迟的时候会遇到一个问题
如何在Gradle中忽略特定的传递依赖?
例如,许多库(例如Spring和...)依赖于commons-logging,我想commons-logging用SLF4J(和它的jcl-over-slf4j桥)替换.
我的gradle脚本中是否有任何提及它的方式,而不是依赖于每个依赖的依赖commons-logging?
我在考虑一个脚本,迭代所有依赖项并在所有依赖项上添加一些exclude,是否有更好的解决方案?那个剧本怎么样?
foo.jar和bar.jarfoo.jar 需要版本1.0的 c.jarbar.jar 需要版本2.0的 c.jarMaven如何解决这场冲突?c.jar将使用哪个版本?
在.NET Core 1.1和Visual Studio 2017 RC中开发示例Web应用程序时,我意识到以下内容:
如你看到的:
我在ClassLibrary3项目的Class3类中编写了一个简单的方法,而Intellisense允许我使用Class1来编写类的名称,我的意思是,没有对ClassLibrary1项目进行显式引用.
我在这里错过了一些观点吗?我不希望有人只是来看看ClassLibrary2.
谢谢.
在Maven中,您可以通过dependencyManagement中的条目覆盖传递依赖项的版本号,因为dependencyManagement优先于传递依赖项定义.
但是(传递)依赖的poms中的dependencyManagement定义呢?它们是否被考虑过?如果是这样,它们会覆盖什么,它们如何被覆盖?
我已使用 扫描了易受攻击的 NuGet 包dotnet list package --vulnerable --include-transitive。我得到以下信息:
Project `MyProject` has the following vulnerable packages
[net6.0]:
Transitive Package Resolved Severity Advisory URL
> System.Net.Http 4.3.0 High https://github.com/advisories/GHSA-7jgj-8wvc-jh57
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在使用 .NET 6。在检查我的 时packages.lock.json,我发现它System.Net.Http 4.3.0依赖于 .NET 6 NETStandard.Library 1.6.1。当阅读咨询 URL上发布的信息时,它说只有某些 .NET Core 1.x 和 2.x 运行时容易受到攻击。同样,我使用的是 .NET 6,因此我预计此漏洞不适用于我。
我很困惑如何处理这个问题。
如果该漏洞与我无关,我非常希望不要收到有关该漏洞的通知。恕我直言dotnet list package,应该考虑到目标框架,自动处理这个问题,但这是另一个问题。无论如何,这是作为 CI 构建的一部分完成的,因此误报很烦人。我不想因为与我无关的内容而收到警告或构建错误的垃圾邮件。
我可以安装最新版本System.Net.Http作为直接依赖项,但可能有数百个传递包,这是一个无法扩展的解决方案:我不想让数百个包保持最新,而且到目前为止因为我知道如果我的其他依赖项发生变化而导致它们过时,没有简单的方法可以自动删除这些“直接安装的传递依赖项”。我特别希望避免这一切,因为我似乎没有受到影响。
我的首选解决方案可能是去找依赖于易受攻击的软件包的软件包的作者并告诉他们进行更新,但首先,由于与上述相同的原因,这不会真正扩展(并且会延迟我获取补丁,特别是如果传递依赖项是从我身上删除的几个步骤,和/或如果其中一个步骤未主动维护),其次,此包仅由 引用NETStandard.Library,这不是您正常的 NuGet 包。
我应该如何处理这个问题(特别是这个例子,以及一般问题),以维护安全最佳实践(特别是修复漏洞)并且不会增加噩梦般的维护负担?
.NET世界中管理导致版本冲突的传递依赖项的最佳实践是什么?
详情:项目A取决于项目B,而项目B又取决于图书馆C.
也
项目A还依赖于项目X,它取决于库C的不同和(可能)不兼容的版本.
A-> B-> Cv1.0
&
A-> X-> Cv2.0
其中
Cv1.0 <> Cv2.0
有没有办法让这项工作?
可以在不使用GAC的情况下完成吗?
即使B和X只是二进制格式(源不可访问),它能否完成?
换句话说,有一种方法可以让Project B和X在项目A中一起使用时使用它们自己的依赖项而不会引起冲突.
注意:我意识到理想情况下我根本不应该有这个问题,但是由于对外部库的依赖扩展,这将是一个不可避免的副作用.所以我想知道它应该如何最好地处理它.
gradle ×3
.net ×2
c# ×2
dependencies ×2
maven ×2
version ×2
.net-core ×1
asp.net-core ×1
build.gradle ×1
database ×1
dll ×1
java ×1
maven-3 ×1
nuget ×1
sql ×1