Composer - 使用本地存储库

Ban*_*ana 47 git composer-php

我是一名Composer初学者,我正在尝试使一个项目依赖于另一个项目,而这两个项目只存在于我的本地机器上.

我的库项目(ProjectA)中的composer.json是:

{
    "name" : "project/util",
    "type" : "library"
}
Run Code Online (Sandbox Code Playgroud)

我在这个项目的基础文件夹中初始化了git.

我的composer.json在项目中取决于第一个(ProjectB):

{
    "repositories": [
        {
            "name" : "util", 
            "type" : "git",
            "url" : "/d/workspaces/util"
        }   
    ],

    "require": {
        "project/util" : "*"
    },
}
Run Code Online (Sandbox Code Playgroud)

当我composer install从ProjectB 运行时,我收到以下错误:

[RuntimeException]
Failed to clone , could not read packages from it
fatal: repository '' does not exist
Run Code Online (Sandbox Code Playgroud)

我认为存储库的url有问题,但我不确定还有什么要写在那里.

Mah*_*alt 45

使用作曲家自动加载本地包(每次更改时都不会打包).

有很多方法可以做到,我将覆盖其中两个:

在所有情况下,我们有两个主要方:
- 本地包(我们不想在packagist上发布的代码,以便能够在我们的项目编写器中自动加载它).
- 主项目(需要使用本地包代码的代码库,可以是另一个包和/或任何项目).


Methode 1 :(直接名称空间)

打开主项目composer.json文件,并使用任何方法(PSR-4,PSR-0,...)自动加载本地程序包命名空间.

例:

如果在本地包的composer.json中我们有:

  "autoload": {
    "psr-4": {
      “Local\\Pack\\": "library"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "Local\\Pack\\Tests\\": "tests"
    }
  },
Run Code Online (Sandbox Code Playgroud)

然后在主项目的composer.json中我们应该:

  "autoload": {
    "psr-4": {
      "Mahmoudz\\Project\\": "src",
      "Local\\Pack\\": "../path/to/local/pack/library”                   << referencing the other local package
    }
  },
  "autoload-dev": {
    "psr-4": {
      "Mahmoudz\\Project\\Tests\\": "tests"
    }
  },
Run Code Online (Sandbox Code Playgroud)

优点:
- 你没有触及供应商目录(错误地运行composer update不会覆盖你的本地更改)
- 你不需要你的包在packagist上使用它
- 你在一个地方工作(本地包)并且更改会自动加载到主项目中
缺点:
- 您无法在生产时发布composer.json(需要在发布之前进行编辑以要求真正的包)

Methode 2 :(本地存储库)

从本地存储库下载本地程序包.

本地包:
1.初始化包中的 git(即使你不想使用它 - 不需要提交任何东西)
2.添加composer.json文件.在文件中,请确保您具有以下内容:

"name": "vendor-name/package-name",  

"autoload": { …   // use whichever method you prefer, but make sure it’s being loaded correctly

"minimum-stability": "dev"  
Run Code Online (Sandbox Code Playgroud)
  1. composer dump-autoload

主项目:
1.编辑你的composer.json以包含以下内容:

  "repositories": [
    {
      "type": "vcs",
      "url": "/full/path/to/the/local/package/package-name"
    }
  ],
  "require": {
    "vendor-name/package-name": "dev-master"
  },
Run Code Online (Sandbox Code Playgroud)
  1. composer update vendor-name/package-name
  2. 现在检查您的供应商目录,您应该看到vendor-name/package-name

注意:每当你在本地软件包(而不是供应商)中进行更改时,你需要git commit然后你可以编写更新主项目,它将获得repo的最新副本到主项目供应商目录.

优点:
- 你没有触及供应商目录(错误地运行composer update不会覆盖你的本地更改) - 你不需要你的包在packagist上使用它
缺点:
- 你必须继续提交你的更改(在本地包中)然后在主项目中运行composer update
- 你无法在生产中发布composer.json(需要在发布之前进行编辑以要求真正的包)

  • 谢谢,非常好!**注意:**如果您使用_vcs_方法(#2),请不要忘记提交您的composer.json更改.很容易忘记,你会不知道为什么作曲家正在用"找不到软件包版本"错误来解决你的软件包. (6认同)
  • 你的第一个方法救了我的命!奖励! (2认同)

Dan*_*ack 24

我觉得你的语法错了.该类型应该只是VCS,然后作曲家计算出它是什么类型的VCS.

所以在你的项目B中,存储库的条目应该是:

"repositories": [
    {
        "type": "vcs",
        "url" : "/d/workspaces/util"
    }
],
Run Code Online (Sandbox Code Playgroud)

您无需为可用的库命名/d/workspaces/util.Composer将扫描该目录中的composer.json文件,并知道那里有哪些项目名称,并使用该目录中的项目优先于packagist或其他存储库上列出的版本.

  • 呃,大概那个目录不存在,或者不可访问? (3认同)
  • 我认为该目录只是拼写错误.你确定你必须提供它作为`/ d/workspaces/util`而不是`d:/ workspaces/util`吗? (3认同)

小智 13

最简单的方法是使用 type=path https://getcomposer.org/doc/05-repositories.md#path

{
    "repositories": [
        {
            "type" : "path",
            "url" : "/d/workspaces/util"
        }   
    ],
    "require": {
        "project/util" : "*"
    },
}
Run Code Online (Sandbox Code Playgroud)


Fri*_*ode 5

当我遇到本地包生产问题时,我发现本教程非常有用:https : //johannespichler.com/developing-composer-packages-locally/

请注意symlink允许供应商文件夹成为符号链接的条件,这意味着您不再需要composer update每次想要查看更改

"options": {
        "symlink": true
      }
Run Code Online (Sandbox Code Playgroud)