Linux CentOS 8 编译安装Apache Subversion

news2024/11/17 13:20:24

前言

距离上一篇发表已经过去了5年零2个多月,这次重新开始写技术博客,理由和原来一样,也就是想把自己学习和工作中遇到的问题和知识记录下来,今天记录一下Linux CentOS 8通过编译安装svn的过程。

下载SVN

下载地址:链接: https://subversion.apache.org/download.cgi
进入下载页面后,我们可以看到当前source code的推荐版本是1.14.2,直接点击下载源码即可:
在这里插入图片描述
下载好之后将源码上传至指定目录:
在这里插入图片描述
输入命令tar -zxvf subversion-1.14.2.tar.gz进行解压之后,即可看到svn的源码目录,如下图所示:
在这里插入图片描述
最后我们输入命令mv ./subversion-1.14.2 /usr/local/svn/source将源码移动到指定目录,计划将svn安装在/usr/local/svn的根目录下。

编译安装SVN

下载完毕后,开始编译源码安装,进入源码所在的source目录后,执行配置(configure)命令同时指定安装路径:

./configure --prefix=/usr/local/svn

如果控制台没有报错那么直接运行命令make && make install即可完成编译和安装,但是这里报错了,需要根据提示信息去补充安装svn所依赖的部分组件,首先看一下我们的报错信息:在这里插入图片描述
如上图所示,提示缺少Apache可移植运行库APR)这个支持库,它是ApacheHTTP服务器的支持库,提供了一组映射到下层操作系统的API。完整的APR包含3个开发包,分别是:APRAPR-utilAPR-iconv,每一个开发包分别独立开发并且拥有自己的版本。APR-util包含了一些常用的开发组件,结合上图的提示信息,我们在安装svn之前必须安装APRAPR-util

安装APR和APR-util

首先打开APR的官方网站:https://apr.apache.org/:
在这里插入图片描述
如上图所示,打开主页后我们可以清晰的看到官方推荐的APRAPR-util的版本分别是APR 1.7.4APR-util 1.6.3 ,所以我们直接点击左侧的Download!去下载这两个版本的源码即可:
在这里插入图片描述
下载成功后将源码上传至指定目录,这里我将安装svn依赖的各种组件库统一放到/usr/local/svn/dependPackage目录中:
在这里插入图片描述
如上图所示,接下来分别解压之后编译安装即可。APR-util安装依赖于APR,因此需要首先安装APR,进入APR源码目录,依次进行配置、编译、安装即可:

./configure --prefix=/usr/local/apr && make && make install

之后再执行命令make && make install进行编译安装即可。
在这里插入图片描述
如上图所示,我们已经成功编译安装了APR支持库。接下来安装APR-util。同样的进入APR-util目录,依次进行配置、编译、安装即可,注意此处需要通过--with-apr配置项来指定APR的目录:

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install

但是安装时候报错了,提示信息如下:
在这里插入图片描述
如上图所示,报错原因是缺少另一个库——Expat,所以接下来我们需要先安装Expat。

安装Expat

Expat的官网地址是:https://libexpat.github.io/
我们在Expat的首页可以清晰的看到关于Expat的解释:

What is Expat?
Welcome to Expat, a stream-oriented XML parser library written in C.
Expat excels with files too large to fit RAM, and where performance and flexibility are crucial.

如上所示,Expat是一个用C语言编写的面向流的XML解析库。Expat擅长处理太大而无法放入内存的文件,以及性能和灵活性至关重要的情况。简单了解一下,接下来从github上下载安装即可,当前的最新版本是2.5.0。下面是Expat的目录结构:
在这里插入图片描述
如上图所示,进入Expat目录后,依次进行配置、编译、安装即可:

./configure --prefix=/usr/local/expat && make && make install

安装好了Expat之后,我们回到上一步再次安装APR-util即可,注意此处需要通过--with-expat配置项来指定Expat的目录:

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-expat=/usr/local/expat && make && make install

检查一下APR-util安装目录,安装成功即可(如下图所示):
在这里插入图片描述
至此我们已经成功安装了APRAPR-util,解决了初始阶段的报错问题,那么我们回到svn的源码目录,再次通过配置命令检查一下是否可以正常安装,注意此处需要通过--with-apr--with-apr-util配置项来指定APRAPR-util的目录:

./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

运行配置命令之后又发现了新的报错信息:
在这里插入图片描述
如上图所示,提示我们没有合适版本的SQLite,所以接下来我们需要先安装SQLite

安装SQLite

SQLite的官网地址是:https://www.sqlite.org/
SQLite是一个用C语言编写的库,实现了一个小型、快速、自包含、高可靠性、功能齐全的SQL数据库引擎,做Android开发的朋友应该都接触过这个数据库,我们在官方首页直接下载即可,目前最新版本是3.42.0
在这里插入图片描述
直接下载即可,根据报错信息提示,我们需要下载sqlite-amalgamation-xxx.zip这个压缩文件,然后通过unzip命令解压并重命名目录为sqlite-amalgamation,注意这个目录需要放在svn源码目录当中。接下来我们按上述步骤操作,首先进入安装包目录解压缩包,然后再将其移动到指定目录:

unzip sqlite-amalgamation-3420000.zip
mv ./sqlite-amalgamation-3420000 ../source/sqlite-amalgamation

接下来回到svn源码目录检查一下SQLite目录是否存在:
在这里插入图片描述
如上所示,没有问题,接下来我们回到svn源码目录,再次通过配置命令检查一下是否可以正常安装,注意不要忘记通过--with-apr--with-apr-util配置项来指定APRAPR-util的目录:

./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

运行之后发现又有报错信息:
在这里插入图片描述

添加配置项–with-lz4=internal

如上图所示,根据提示,我们加上配置项--with-lz4=internal之后再次运行配置命令:

./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-lz4=internal

又发现了新的报错信息:
在这里插入图片描述
如上图所示,提示svn需要utf8proc,请安装它,所以我们接下来先安装utf8proc

安装utf8proc

utf8procgithub项目地址是:https://github.com/JuliaStrings/utf8proc
utf8proc是一个小巧、干净的C语言库,提供了对UTF-8编码的Unicode数据进行规范化、大小写折叠和其他操作的功能。简单了解一下,目前utf8proc的最新版本是2.8.0,我们直接下载源码上传至指定目录解压:
在这里插入图片描述
如上图所示,然后运行make && make install即可完成utf8proc编译安装。安装完成之后我们再次重复之前的操作,进入svn源码目录运行配置命令检查是否已经可以正常编译安装:

./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-lz4=internal

这次终于没有了任何报错信息,最后我们在svn源码目录运行命令make && make install完成安装即可,看一下安装好之后的svn目录:
在这里插入图片描述

加入PATH环境变量

安装结束之后,首先我们需要把svn的bin目录加入到PATH环境变量中,方便我们全局使用svn命令。首先进入配置文件vi /etc/profileLinux中的系统环境变量PATH的添加方式是通过冒号拼接路径的方式来添加,如下图所示:
在这里插入图片描述
然后运行svn命令检查一下版本:

svn --version

这里报错了,看一下提示信息:
在这里插入图片描述
如上图所示,这里提示加载共享库错误,应该是在上面安装utf8proc时出了一些问题。解决方法很简单,依次按以下步骤操作即可:

  1. 编辑/etc/ld.so.conf文件,执行vi /etc/ld.so.conf,添加下面一行代码/usr/local/lib
  2. 执行ldconfig命令更新缓存。

接下来我们再次运行svn --version命令检查一下svn版本:
在这里插入图片描述
如上图所示,已经可以成功看到svn的版本相关信息,至此环境变量添加结束。

创建SVN版本库

svn安装完成之后,下一步首先要做的就是创建我们的版本库,这里我们选择/home/svn作为svn版本库的根目录,首先创建该目录:

mkdir -p /home/svn

根目录创建完成后,接下来我们创建需要交给svn管理的项目目录,因为svn是以项目为单位去进行版本控制的。例如这里我们有一个项目名叫vue_basic,那么我们接下来在根目录下创建该项目目录:

mkdir -p /home/svn/vue_basic

接下来通过svnadmin create命令进行版本库初始化:

svnadmin create /home/svn/vue_basic

命令执行成功之后我们可以在该目录下看到svn版本库的初始结构:
在这里插入图片描述
如上图所示,这样我们的版本库就已经初始化完毕,db目录是数据文件存放目录,我们上传至svn的代码文件都是以特定格式压缩后存放在这里,而conf目录就是配置文件目录,下面我们要做的就是配置用户权限。

配置SVN服务器

关于SVN服务器配置的相关信息,我们可以在SVN社区的用户手册(the Subversion book)中获取相关信息,在文档中的第6章节(Chapter 6. Server Configuration)可以看到服务器配置的相关说明。下面是关于SVN服务器配置的概述:

Subversion was designed with an abstract repository access layer. This means that a repository can be programmatically accessed by any sort of server process, and the client “repository access” API allows programmers to write plug-ins that speak relevant network protocols. In theory,Subversion can use an infinite number of network implementations. In practice, there are only two Subversion servers in widespread use today.

如上介绍,SVN的设计包括一个抽象的网络层,这意味着版本库可以通过各种服务器进程访问,目前的实践中存在2种SVN服务器。继续看文档中对于这2种SVN服务器的解释说明:

Apache is an extremely popular web server; using the mod_dav_svn module, Apache can access a repository and make it available to clients via the WebDAV/DeltaV protocol, which is an extension of HTTP.In the other corner is svnserve: a small, lightweight server program that speaks a custom protocol with clients.

如上介绍,可以看出这两种服务器方案分别是:

  1. Apache+mod_dav_svn:通过使用mod_dav_svn模块,Apache可以访问版本库,并且可以使客户端使用HTTP的扩展协议WebDAV/DeltaV进行访问
  2. svnserve:一个小的,独立服务器,使用自己定义的协议和客户端

这两种方式各有优缺点,我们根据实际需求选择即可。通常情况下中小型团队建议使用svnserve,因为这种方式简单快速且能满足绝大多数情况下的版本控制需求。这里我们也选择使用svnserve,需要分别对3个文件进行配置,它们分别是conf目录下的passwdauthzsvnserve.conf,下面依次进行介绍:

配置用户密码(passwd)

首先第一步我们先打开passwd文件新增svn用户和密码:
在这里插入图片描述
如上图所示,passwdsvnserve的示例密码文件,用于定义访问SVN服务器的用户帐号密码信息。在[users]配置项下面新增用户,格式很简单直接写【用户名=口令】即可,这里我们新增了一个用户名为wangliang且密码为123456的用户。

配置用户权限(authz)

第一步配置了用户之后,接下来我们需要做的就是为已添加的用户配置操作SVN版本库的权限,首先打开/conf/authz文件:
在这里插入图片描述
如上所示,authzsvnserve的示例授权文件,可以看到defines authorizations for the path字样,即是“基于路径的授权策略”,简单来讲,就是配置某个用户(a single user)或者某一组用户(a group of users)对某个目录的访问权限(read/read and write/no access)。我们可以在文档中的Chapter 6.Server Configuration中的Path-Based Authorization章节中我们可以找到相关信息:

Both Apache and svnserve are capable of granting (or denying) permissions to users. Typically this is done over the entire repository:a user can read the repository (or not), and she can write to the repository (or not). It’s also possible, however, to define finer-grained access rules. One set of users may have permission to write to a certain directory in the repository, but not others; another directory might not even be readable by all but a few special people. As files are paths, too, it’s even possible to restrict access on a per file basis.

如上所示,和我们上面总结的结论基本一致,Apache和svnserve都能向用户授权,通常是针对整个仓库进行,对仓库进行读写。也可以更细化的控制到仓库的某个目录的读写,接下来我们依次开始进行配置:

配置用户组(groups)

svnserve允许我们配置一组用户并为他们授权,在授权示例文件中我们可以看到配置示例代码:
在这里插入图片描述
如上图所示,在[group]配置项下,我们通过[用户组名]=[用户组列表]的格式进行用户组配置。用户组列表的每个成员之间通过逗号分隔。例如我们配置两组用户,分别是开发组(dev_group)3名成员和测试组(test_group)3名成员:

[groups]
dev_group=wangliang,libo,fanyuanli
test_group=hubin,liumei,zhangchao

如上图所示,我们定义好了两个用户组之后,接下来我们就为用户或用户组配置权限。

授权

权限分为三种,我们在文档中可以看到相关说明:

grant read (‘r’) access, read-write (‘rw’) access, or no access (‘’).

  1. 只读(r)
  2. 读写(rw)
  3. 禁止访问(’ ')

而授权对象存在6种方式,在上面的svnserve的授权示例文件中我们也可以看到,我们最常用的是以下3种方式,它们分别是:

  1. 单用户(a single user)
  2. 用户组(a group of users)
  3. 所有用户(anyone)

例如:我们要给wangliang用户设置读写权限,给上面创建的test_group测试组用户都设置只读权限,那么授权代码这样写即可:

wangliang = rw
@test_group = r

这里注意引用用户组时需要在前面加上@符号。

只有上面这两行还不够,之前说了svnserve基于路径的授权策略,也就是说我们必须再指定一个目录,当上面的用户或用户组来访问,文档中有以下说明:

To be more specific: the value of the section names is either of the form [repos-name:path] or of the form [path].

如上所示,可以看到通常我们的路径格式是[版本库名:路径],例如,如果我们希望wangliang用户可以操作vue_basic这个版本库的所有内容,按如下配置即可:

[vue_basic:/]
wangliang = rw

如果不指定仓库名称的话,那么你的权限将作用于所有版本库中的同名路径配置中,文档中也有相关说明:

If you’re using the SVNParentPath directive, it’s important to specify the repository names in your sections. If you omit them,a section such as [/some/dir] will match the path /some/dir in every repository. If you’re using the SVNPath directive,however, it’s fine to only define paths in your sections—after all, there’s only one repository.

最后再给出几个简单示例,加深理解:

[groups] 
xnzz_test = songming,liqiang,zhoufang

[xnzz:/] 
@xnzz_test = r
* =

[xnzz_dev:/home/wangliang] 
wangliang = rw
* = r

上面的代码定义了1个用户组xnzz_test,有3名成员。定义了2个版本库xnzzxnzz_devxnzz版本库下的所有目录只有xnzz_test用户组的成员可以进行读操作,其余所有用户禁止访问。xnzz_dev版本库的/home/wangliang目录只有wangliang用户可以进行读写操作,其余用户禁止访问。

配置svnserve.conf

最后还需要配置一下/conf/svnserve.conf这个文件,它是svnserve服务器的一个全局配置文件。我们打开之后可以看到它的说明简介:
在这里插入图片描述
通常我们只需要配置[general]这个section中的以下属性:

  1. anon-access:控制非授权用户访问版本库的权限。取值范围为writereadnone。默认值为read只读。
  2. auth-access:控制授权用户访问版本库的权限。取值范围为writereadnone。默认值为write可修改。
  3. password-db:指定用户名口令文件名。除非指定绝对路径,否则文件位置为相对conf 目录的相对路径。 默认值为passwd,也就是我们刚才配置的密码文件。
  4. authz-db:指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。除非指定绝对路径,否则文件位置为相对conf目录的相对路径。 默认值为authz-db,同样的这也是我们刚才配置过的授权文件。
  5. realm:指定版本库的认证域,即在登录时提示的认证域名称,不用配置也没关系。

保存之后,至此我们svn服务器的配置内容就全部结束了。

启动SVN服务器

输入命令:

svnserve -d -r /home/svn/

即可启动SVN服务器,注意启动路径必须是版本库的根目录,而不是某个子目录。

停止SVN服务器

输入命令:

killall svnserve

即可停止SVN服务器。

Windows客户端测试连接

成功启动SVN服务器之后,我们通过Windows客户端工具TortoiseSVN来连接测试一下是否可以正常进行版本控制。直接搜索安装TortoiseSVN即可,安装好之后鼠标右键点击TortoiseSVN-->Repo browser进入版本库浏览器界面:
在这里插入图片描述
如上图所示,输入svn://ip/仓库名即可,注意一下Linux系统需要放开SVN的6379端口。点击确定之后如果没有什么问题会弹出输入框:
在这里插入图片描述
如上图所示,输入我们之前在passwd文件中配置的用户名和密码,直接登录即可,登录成功后可以看到下面的版本库浏览器界面:
在这里插入图片描述
至此我们就可以使用SVN开始进行版本控制了,简单的文件管理直接使用TortoiseSVN,代码管理则需要在相关的IDE中集成SVN插件并进行相关配置即可。

总结

本篇blog简单记录一下Linux下搭建SVN服务器的过程,尽管目前分布式版本控制工具Git已成为主流,但SVN依然是集中式版本控制工具的代表。希望对遇到类似问题的朋友有所帮助,The End。(ps:时隔5年多的第一篇csdn博客,后面会继续坚持记录技术路程的点点滴滴,加油!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/804259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p

使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p 管理员Ubuntu配置公网服务端frps配置service自启(可选) 配置内网服务端frpc配置service自启(可选) 使用者配置service自启(可选) 效果 通过frp实现内网client访问另外一个内网服务器 管理员 1)…

PHP8的注释-PHP8知识详解

欢迎你来到PHP服务网,学习《PHP8知识详解》系列教程,本文学习的是《PHP8的注释》。 什么是注释? 注释是在程序代码中添加的文本,用于解释和说明代码的功能、逻辑或其他相关信息。注释通常不会被编译器或解释器处理,而…

深度学习实战44-Keras框架下实现高中数学题目的智能分类功能应用

大家好,我是微学AI ,今天给大家介绍一下深度学习实战44-Keras框架实现高中数学题目的智能分类功能应用,该功能是基于人工智能技术的创新应用,通过对数学题目进行智能分类,提供个性化的学习辅助和教学支持。该功能的实现可以通过以下步骤:首先,采集大量的高中数学题目数据…

Clion实现Stm32标准库-HAL库开发配置

1、配置CLion用于STM32开发(基于hal库开发) 原文链接 https://zhuanlan.zhihu.com/p/145801160 2、配置CLion用于STM32开发(基于标准库开发) 参考文章:https://www.bilibili.com/read/cv11442303

不再困扰!教你如何方便快捷地将文件转换成PDF格式!

大家都知道PDF是电脑中最常见且兼容性最好的一种文档文件格式,而这种格式的文件既能保留文档的原始布局,又能够方便阅读和打印。那么,当我们需要将其他格式的文件转换成PDF格式时应该如何处理呢?我们可以使用一款文档转换工具&…

【QT 网络云盘客户端】——获取用户文件列表信息

目录 1.获取用户文件列表信息分析 2.设置图标属性 3.向服务器获取文件的数量 4.向服务器获取文件信息列表 4.显示图标 1.获取用户文件列表信息分析 1.将QListWidget设置为图标模式 2. 当我们点击"按下载量升序","按下载量降序",“更新” 菜单选项 都会…

3、HAproxy高级配置

基于cookie的会话保持 在 HAProxy 中,可以通过使用 cookie 配置来实现基于 Cookie 的会话保持。cookie 配置用于配置与会话保持相关的选项,允许您定义要在HTTP响应中插入或重写的Cookie以及其他与Cookie会话保持相关的参数。 以下是一些常用的 cookie 配…

已解决 IDEA Maven 项目中 “Could not find artifact“ 问题的常见情况和解决方案

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

QT第四讲

思维导图 基于QT的网络聊天室 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器类 #include<QTcpSocket> //客户端类 #include<QMessageBox> //对话框类 #include<QList…

Windows使用Notepad++编辑Linux服务器的文件

&#x1f680; Windows使用Notepad编辑Linux服务器的文件 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介…

<el-date-picker>组件选择开始时间,结束时间自动延长30min

背景&#xff1a;选择开始时间&#xff0c;结束时间自动增加30分钟&#xff0c;结束时间也可重新选择&#xff0c;如图&#xff1a; <el-form-item label"预约开始时间" prop"value1"><el-date-pickersize"large"v-model"ruleForm…

Vue2 第三节 数据代理和事件处理

1.Object.defineProperty 方法 2.数据代理 3.Vue中的数据代理 4.事件的基本使用 5.事件修饰符 6.键盘事件 一.Object.defineProperty 方法 &#xff08;1&#xff09;学习Object.defineProperty为下一节数据代理做准备 &#xff08;2&#xff09;更加高级的给对象添加属…

两个csv进行根据相同字段进行合并

源文件&#xff0c;第一列&#xff0c;编号0 目标文件&#xff0c; 编号3 根据社区名称进行匹配&#xff0c;然后将第一个csv文件的经纬度添加到第二个文件中。 import csvsource r"D:\000datasets\链家房价数据\2020去重后社区名称地理编码.csv" target r"…

TAURI桌面平台制作应用程序工具包初体验

原文&#xff1a;https://tauri.app/zh-cn/v1/guides/getting-started/setup/html-css-js 前提&#xff1a;https://tauri.app/zh-cn/v1/guides/getting-started/prerequisites 步骤1&#xff1a; 在 D:\MyStudy\TauriDemo 文件夹下新建 ui 文件夹&#xff0c;在 ui 文件夹中…

QChart笔记5:Polar Chart极坐标用法

QChart还有专门画极坐标的类QPolarChart&#xff0c;它的界面是一个圆盘。 #include <QApplication> #include <QDebug> #include <QtCharts/QScatterSeries> #include <QtCharts/QLineSeries> #include <QtCharts/QPolarChart> #include <Q…

HR:“抱歉不合适!”,竟是没有满足这项硬性要求?

兼容性测试主要通过人工或自动化的方式&#xff0c;在需要覆盖的终端设备上进行功能用例执行&#xff0c;查看软件性能、稳定性等是否正常。 对于需要覆盖的终端设备&#xff0c;大型互联网公司&#xff0c;像 BAT&#xff0c;基本都有自己的测试实验室&#xff0c;拥有大量终…

资深测试总结,自动化测试-ddt数据驱动yaml文件实战(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 ddt 驱动 yaml/ym…

matplotlib从起点出发(5)_Tutorial_5_sytleSheets

1 使用样式表和rcParams自定义matplotlib 以下是自定义matplotlib的属性和默认样式的提示。 有三种方式来自定义matplotlib: 在运行时设置rcParams&#xff1b;使用样式表&#xff1b;改写matplotlibrc文件。 在运行时设置rcParams优先于样式表&#xff0c;样式表优先于matp…

用户分享|当我升级了 CloudQuery 2.2.0 后......

导读&#xff1a; 7 月 13 日&#xff0c;CloudQuery&#xff08;下文简称 CQ&#xff09; 2.2.0 版本正式发布&#xff0c;在看到官方文档对新版本的介绍后&#xff0c;马上进行安装测试。本文主要为大家介绍从 CQ 1.4.2 升级到 2.2 的考量因素、测试情况&#xff0c;分享一些…

SCO 267,1656261-09-4,是一种变构GPR40全激动剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu 产品结构式&#xff1a; ​ 产品规格&#xff1a; SCO-267 1.CAS号&#xff1a;1656261-09-4 2.分子式&#xff1a;C36H46N4O5 3.分子量&#xff1a;614.79 4.包装规格&#xff1a;1g、5g、10g&#xff0c;包装灵活 5.外观颜…