无法在Windows上的作曲家中使用远程存储库

时间:2016-05-10 09:55:57

标签: php windows git composer-php

我有一个带库的存储库。它可以成功克隆。

$ git clone file:////remote/repo/library
$ cd library
$ composer validate
./composer.json is valid, but with a few warnings

但似乎这个故事不能通过作曲家包含来使用。

...
"repositories": [
    {
        "type": "git",
        "url": "file:////remote/repo/library"
    }]
 ...

尝试安装

$ composer install -vvv
... 
Loading composer repositories with package information
Executing command (//remote/repo/library): git show-ref --tags
Executing command (//remote/repo/library): git branch --no-color --no-abbrev -v
Executing command (//remote/repo/library): git branch --no-color
Executing command (//remote/repo/library): git show "master":composer.json

  [Composer\Repository\InvalidRepositoryException]
  No valid composer.json was found in any branch or tag of 
  file:////remote/repo/library, could not load a package from it.
...

如何在带有作曲家的窗口上使用远程存储库?

4 个答案:

答案 0 :(得分:8)

Composer将能够计算出您正在使用的VCS类型,因此请"type": "git"代替"type": "vcs",而不是git(请参阅Composer docsthis SO answer

如果您只想指向本地存储库而不是克隆它或使用特定于git的操作(如版本标记等),而不是使用git clone克隆,则可以path reference使用它。 )。

同样在Windows上,可能需要对存储库/库路径使用Windows样式格式(请参阅Composer - using a local repository SO注释),如果它是Windows共享驱动器,则可能需要检查权限。

修改

我对此有了更深入的了解,即使只看一下我自己电脑的网络名称,也可以很容易地重现composer installfile://\\\\remote\\repo\\library行为。

尝试使用Windows风格的语法(即file://)对我来说不起作用,因为它在某个地方的git进程中出现了。

看起来围绕命名网络驱动器在编写器本身内部交互存在一些问题:因为您可以使用所描述的//drive/repo语法在本地磁盘上加载存储库,并且可以正确克隆和获取文件使用普通git语法和命令行git daemon的网络驱动器我不确定这是否必须能够在不深入编写作曲源的情况下解决(这是某人需要{ {3}})。

这意味着将网络驱动器位置设置为映射到本地计算机上的字母(根据get local Windows drive support)也可以正常工作,因为它将被视为与本地Windows驱动器相同。如果你想自动映射/取消映射驱动器,你也可以添加钩子作为@smcjones指出(尽管你必须记住不要将该驱动器号分配给其他任何东西)。

假设您有权访问相关计算机,那么在您希望提供服务的本地网络计算机上设置git://(使用smcjones' answer非常简单),因此您可以使用{{ 1}}协议版本运行良好,但根据您的设置,您可能还需要确保this answer设置为"dev",如果您未通过HTTPS传输,则可能需要查找本地作曲家配置文件(可能在C:\Users\Username\AppData\Roaming\Composer\config.json中)并添加"minimum-stability" flag以通过网络提供服务而无需设置SSL证书(除非你想设置它)。

答案 1 :(得分:6)

您可以尝试添加package repository类似的to this one

  

基本上,您定义了编辑器存储库packages.json中包含的相同信息,但仅限于单个包。
  同样,所需的最低字段为nameversion以及distsource

(见also this example

然后检查问题是否仍然存在。

以防万一,先检查是否:

答案 2 :(得分:2)

如果您打算将此共享用作repo服务器,或者从多个位置提取此repo,您​​可能希望在设置Git守护程序时使用Leith's answer,或者您可以查看设置{ Windows 10上的{3}}。这些需要在网络上进行额外的设置工作。

以下方法对于只是尝试将某些内容拼凑在一起并且不想处理服务器配置或守护进程的人来说非常有用。它不需要访问服务器权限,只需要您访问网络上的位置。

最快的行动方案是手动或自动映射您的网络驱动器。在命令行中,如果要映射到" R":

net use R: \\remote\repo

或者,您可以使用作曲家的script功能自动设置此功能,并构建一个小的.cmd文件,以便在pre-update-cmdpost-update-cmd上执行:

map_drive.cmd:

if not exist r: (
    net use R: "\\remote\path\to\repo"
)

您可以对post-update-cmdpost-install-cmd执行相同的操作,以取消映射网络驱动器。

unmap_drive.cmd

if exist r: (
    net use R: /delete
)

composer.json:

\..
"scripts": {
    "pre-install-cmd": [
        "map_drive.cmd"
    ],
    "pre-update-cmd": [
        "map_drive.cmd"
    ],
    "post-install-cmd": [
        "unmap_drive.cmd"
    ],
    "post-update-cmd" [
        "unmap_drive.cmd"
    ]
}
...

现在您可以直接访问。

\...
"repositories": [
    {
        "type": "git",
        "url": "R:/library"
    }]
 ...

请注意,虽然SSH server已指出您必须使用file://r/代替R:/,但我发现file协议无法解决我的问题的Windows。使用适合您的语法!

是否使用此补丁方法或更复杂的方法取决于您的应用程序和使用。在某些情况下运行git守护程序或SSH服务器可能会被视为烦恼,并增加了更多开销。如果您只打算暂时或偶尔使用它,上面的脚本应该让您运行。

答案 3 :(得分:1)

做类似下面的事情。

{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/igorw/monolog"
        }
    ],
    "require": {
        "monolog/monolog": "dev-bugfix"
    }
}

有关详情,请查看More info